我是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)=>不确定
有什么建议吗?
答案 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 采用两个参数:
第一个参数是从类型a
到b
的函数。
第二个参数是类型为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)