繁体   English   中英

为什么`fmap总和Just`typecheck?

[英]Why does `fmap sum Just` typecheck?

我们知道fmapfmap :: Functor f => (a -> b) -> fa -> fbsumsum :: (Num a, Foldable t) => ta -> a ,但下面的代码让我感到困惑。

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

为什么?

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

第一个,最明显的是, 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM