gpt4 book ai didi

haskell - fmap 如何与数据构造函数一起使用?

转载 作者:行者123 更新时间:2023-12-02 17:19:25 24 4
gpt4 key购买 nike

我正在尝试理解一些 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com