chr*_*tic 1 haskell functional-programming functor maybe contravariant
我正在研究Haskell,并被要求解决此练习:
实现一个名为NovoPred的新数据类型,该数据类型应具有一个具有相同名称的值构造函数。它还应该有一个名为runNovoPred的字段,其类型可能是-> Bool然后,为NovoPred类型创建一个Functor Contravariant实例
为了解决此问题,我提出了以下解决方案:
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)
Run Code Online (Sandbox Code Playgroud)
您可能会注意到,该解决方案根本不起作用。Contramap需要具有以下结构:(a -> b) -> f b -> f a问题是x函数希望接收一个看起来像的值,Maybe b并且实际上正在接收一个值,b因为那是y函数返回的值。因此,这是不可能的x . y,因为x期望接收到的值与y实际返回的值不匹配。
因此,我认为我需要一种使y函数返回type值的方法Maybe b。不幸的是,我对如何执行此操作contramap一无所知,因为期望接收诸如a -> b第一个参数之类的东西而不是诸如此类a -> Maybe b(我需要的东西)。你能帮我吗?
如果您有一个函数,y :: a -> b并且需要将a转换Maybe a为a Maybe b,则可以fmap结束Maybe:
contramap y (NovoPred x) = NovoPred (x . fmap y)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
59 次 |
| 最近记录: |