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

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(我需要的东西)。你能帮我吗?

Fyo*_*kin 5

如果您有一个函数,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)