【发布时间】:2018-01-07 05:42:56
【问题描述】:
我是 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
在我看来,一旦我实现了 Functor for Unsure,fmap 应该可以工作。所以我可以使用 fmap 来做类似的事情:
fmap (+3) (+100) Sure 1
结果应该是 Sure 104 ,实际上我得到了错误
• 约束中的非类型变量参数:Num(不确定 a) (使用 FlexibleContexts 来允许这样做) • 检查推断类型时 它 :: forall a. (Num (Unsure a), Num a) => 不确定
有什么建议吗?
【问题讨论】:
-
为什么你认为这应该有效?
-
我弄错了,现在当我输入 fmap (+3) Sure 1 时,它显示 Sure 4。
-
其实我想要一个通用的方法来取消 Unsure 然后我可以做一些事情比如 fmap (==) 100 (Sure 100)。
-
这是一个有趣的错误!如果你写了
fmap (+3) (Sure 1),事情就会奏效,fmap (+3) (+100) 1也会奏效(出于微妙的原因)。如果您写了fmap (+3) Sure 1,您可能会收到一条合理的错误消息,但fmap (+3) (+100) Sure 1是一个完美的风暴,它会创建一个令人讨厌的错误消息。 -
你已经可以这样做了,你只需要把
100放在括号内:fmap (==100) (Sure 100)Sure True。