我正在尝试理解一些 Haskell 代码。
这是有道理的。
Prelude> fmap (+1) (Just 1)
Just 2
这也是有道理的。
Prelude> (fmap.fmap) (+1) (Just [1])
Just [2]
但我不明白这是如何工作的。
Prelude> (fmap.fmap) (+1) Just 1
Just 2
我已经尝试过将零件加工出来。在我看来,这就是正在发生的事情。
(fmap (fmap (+1)) Just) 1
我尝试输入子表达式。
这是有道理的。
Prelude> :t fmap (+1)
fmap (+1) :: (Functor f, Num b) => f b -> f b
这仍然有道理。
Prelude> :t fmap (fmap (+1))
fmap (fmap (+1)) :: (Functor f, Functor f1, Num b) =>
f (f1 b) -> f (f1 b)
但是我不明白这个。
Prelude> :t fmap (fmap (+1)) Just
fmap (fmap (+1)) Just :: Num b => b -> Maybe b
带有类型的函数是如何实现的
(Functor f, Functor f1, Num b) => f (f1 b) -> f (f1 b)
应用 Just
后,其类型为:
a -> Maybe a
结果是这种类型吗?
Num b => b -> Maybe b
问题confused about function as instance of Functor in haskell可能与此有关,但我仍然很困惑。
最佳答案
发生的事情是 f
解析为仿函数 (->) a
,而 f1
解析为 Maybe
,自从
Just :: (->) a (Maybe a)
因此,如果我们使用上述绑定(bind)编写 fmap (fmap (+1))
的类型,我们会得到:
fmap (fmap (+1)) :: Num b => (->) a (Maybe b) -> (->) a (Maybe b)
将 (->)
重写为中缀构造函数,我们得到:
fmap (fmap (+1)) :: Num b => (a -> Maybe b) -> (a -> Maybe b)
现在我们将其应用于 Just::a -> Maybe a
所以我们得到
fmap (fmap (+1)) Just :: Num a => a -> Maybe a
关于haskell - fmap 如何与数据构造函数一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48971234/