学习如何在预期(a->;可能是b)而不是(a->;b)作为第一个参数(Haskell)时使用contramap

学习如何在预期(a->;可能是b)而不是(a->;b)作为第一个参数(Haskell)时使用contramap,haskell,functional-programming,functor,maybe,contravariant,Haskell,Functional Programming,Functor,Maybe,Contravariant,我正在学习Haskell,我被要求解决这个问题: 实现一个名为NovoPred的新数据类型,该数据类型应具有一个值 具有相同名称的构造函数。它还应该有一个名为 然后,创建一个函子 NovoPred类型的逆变实例 为了解决这个问题,我制定了以下解决方案: 模块Oitavo,其中 导入Data.Functor.Contravariant 新型NovoPred a= 诺富普雷德 {runNovoPred::可能是->Bool } 实例逆变NovoPred,其中 对比图y(NovoPred x)=Nov

我正在学习Haskell,我被要求解决这个问题:

实现一个名为NovoPred的新数据类型,该数据类型应具有一个值 具有相同名称的构造函数。它还应该有一个名为 然后,创建一个函子 NovoPred类型的逆变实例

为了解决这个问题,我制定了以下解决方案:

模块Oitavo,其中
导入Data.Functor.Contravariant
新型NovoPred a=
诺富普雷德
{runNovoPred::可能是->Bool
}
实例逆变NovoPred,其中
对比图y(NovoPred x)=NovoPred(x.y)
正如您可能注意到的,这个解决方案根本不起作用
contracmap
需要有这样的结构:
(a->b)->fb->fa
,问题是
x
函数期望接收一个看起来像
可能是b
的值,而实际上它正在接收一个值
b
,因为这就是
y
函数返回的结果。因此,不可能执行
x。y
,因为
x
希望收到的值与
y
实际返回的值不匹配


所以,我想我需要一种方法使
y
函数返回一个类型为
的值,可能是b
。不幸的是,我不知道该怎么做,因为
contramap
希望接收像
a->b
这样的内容作为第一个参数,而不是像
a->Maybe b
(这就是我需要的)。你能帮我一把吗?

如果你有一个函数
y::a->b
,你需要把a
也许a
转换成a
也许b
,你就可以
fmap
也许

contramap y (NovoPred x) = NovoPred (x . fmap y)

如果您有一个函数
y::a->b
,并且需要将a
可能a
转换为a
可能b
,您只需将
fmap
转换为
可能

contramap y (NovoPred x) = NovoPred (x . fmap y)
NovoPred(x.something)
中,
something
不仅应该返回a
可能是a
,还应该接收a
可能是b
。现在你如何从
y::b->a
构造这样一个函数呢?在
NovoPred(x.something)
中,
something
不仅应该返回a
可能是a
,还应该接收a
可能是b
。现在,如何从
y::b->a
构造这样的函数?