11

We know fmap is fmap :: Functor f => (a -> b) -> f a -> f b and sum is sum :: (Num a, Foldable t) => t a -> a, but the code below confuse me.

> :t (fmap sum Just)
(fmap sum Just) :: Num b => b -> b
> fmap sum Just 3
3

why?

4

1 回答 1

12

我认为这里可能有两个令人困惑的地方。

首先,最明显的是,它sum适用于Foldable事物,而不仅仅是列表。所以:

sum (Just 3) == 3

第二个是您正在使用的仿函数实例。由于Just是一个函数,因为它是 的第二个参数fmap,所以您正在使用 fmap 的读取器实例,它在此处定义(https://hackage.haskell.org/package/base-4.9.1.0/docs/src/GHC .Base.html#line-638 ) 一样简单(.)

它看起来很奇怪,并且不应该进行类型检查,因为您向 fmap 提供了三个参数,但实际上, (fmap sum Just) 的结果是一个函数:

Prelude> :t fmap sum Just
fmap sum Just :: Num b => b -> b  

如果我们用 替换fmap.事情开始变得更有意义。

Prelude> (.) sum Just 3
3

Prelude> (sum . Just) 3
3

这与

sum (Just 3)
于 2017-04-10T04:01:11.787 回答