如何在haskell中为自定义数据实现Functor实例

时间:2017-07-31 15:10:49

标签: haskell functor

我是Haskell的初学者。现在我尝试将数据定义如下:

data Unsure a = Sure a |Error [Char]
 deriving (Show)
然后尝试像这样实现Functor:

instance Functor Unsure where
    fmap f (Sure x) = Sure (f x)
    fmap f (Error e) = Error e

在我看来,fmap应该可以工作一旦我实现Functor for Unsure。所以我可以使用fmap做类似的事情:

fmap (+3) (+100) Sure 1

结果应该是当然104 ,实际上我收到了错误

  

•约束中的非类型变量参数:Num(不确定a)         (使用FlexibleContexts允许此操作)       •检查推断类型时           它:: forall a。 (Num(不确定a),Num a)=>不确定

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

您可能打算撰写fmap ((+3) . (+100)) (Sure 1)fmap (+3) $ fmap (+100) (Sure 1)

答案 1 :(得分:1)

fmap 是一个类型为fmap :: Functor f => (a -> b) -> f a -> f b

的函数

简而言之,函数 fmap 采用两个参数: 第一个参数是从类型ab的函数。 第二个参数是类型为a的Functor的值。结果是类型为b的Functor。

在你的例子中,你写道:fmap (+3) (+100) Sure 1。在此示例中, fmap 具有四个参数: 首先是(+3),第二个是(+100),第三个是Sure,第四个是1

由@Brian Olivier撰写,用(+3)(+100)作出一个论点 您可以将它们与(。)运算符组合并将此表达式放入括号中。然后,这将为您提供fmap的第一个参数。

然后你必须将Sure 1放入括号中 得到fmap的第二个参数。

所以你必须写fmap ((+3) . (+100)) (Sure 1)

答案 2 :(得分:0)

除了其他人所说的内容之外,如果你添加使用DeriveFunctor语言扩展(例如通过{-# LANGUAGE DeriveFunctor #-} pragma),你可以派生出仿函数:

data Unsure a = Sure a |Error [Char]
  deriving (Show, Functor)