我正在研究Haskell,并被要求解决此练习:
实施名为NovoPred的新数据类型,该数据类型应具有一个值 具有相同名称的构造函数。还应该有一个名为 类型可能为-> Bool的runNovoPred然后,创建一个Functor 类型NovoPred的相反实例
为了解决此问题,我提出了以下解决方案:
module Oitavo where
import Data.Functor.Contravariant
newtype NovoPred a =
NovoPred
{ runNovoPred :: Maybe a -> Bool
}
instance Contravariant NovoPred where
contramap y (NovoPred x) = NovoPred (x . y)
您可能会注意到,该解决方案根本不起作用。 Contramap
需要具有以下结构:(a -> b) -> f b -> f a
,问题在于x
函数希望接收一个看起来像Maybe b
的值,而实际上却接收到一个值{{1 }},因为这就是b
函数返回的内容。因此,无法进行y
,因为x . y
期望接收到的值与x
实际返回的值不匹配。
因此,我认为我需要一种使y
函数返回类型为y
的值的方法。不幸的是,由于Maybe b
希望收到像contramap
这样的东西作为第一个参数,而不是像a -> b
这样的东西,我对此一无所知(这就是我所需要的)。你能帮我吗?
答案 0 :(得分:5)
如果您具有函数y :: a -> b
,并且需要将Maybe a
转换为Maybe b
,则可以在fmap
上Maybe
:
contramap y (NovoPred x) = NovoPred (x . fmap y)