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

标签 haskell functor

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

相关文章:

haskell - 功能阵列倍增堆栈的摊销

debugging - 帮助调试 Haskell 中大量数据的意外 takeWhile 行为

recursion - 递归可区分联合和映射

c++ - 根据命令行输入返回仿函数

c++ - C++ 中的 () 运算符是什么?

haskell - Haskell 中的 Monoid Bool

http - Network.HTTP.Conduit 的 Haskell simpleHTTP 对于 get 请求执行缓慢

haskell - 将 Int 转换为 Integer

haskell - 为什么在这个函数的类实例中不能接受这个保留结构的 "fmap"?

c++ - 为什么我不能返回带有透明仿函数的法线贴图引用?