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

问题描述 投票:0回答:1

我正在学习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的值,并且实际上正在接收一个值b,因为这就是y函数返回。因此,不可能执行x . y,因为x期望接收到的值与y实际返回的值不匹配。

所以,我想我需要一种使y函数返回Maybe b类型的值的方法。不幸的是,我不知道如何执行此操作,因为contramap希望接收像a -> b这样的东西作为第一个参数,而不是像a -> Maybe b这样的东西(这就是我所需要的)。你能帮我吗?

haskell functional-programming functor maybe contravariant
1个回答
0
投票

如果具有功能y :: a -> b,并且需要将Maybe a转换为Maybe b,则可以只将fmap转换为Maybe

contramap y (NovoPred x) = NovoPred (x . fmap y)
© www.soinside.com 2019 - 2024. All rights reserved.