我正在读非常好的《Haskell编程:从基础原理到实践》,感觉很兴奋。在电子书上的第1286页,我看到了以下例子,但我无法理解:
Prelude> (fmap . fmap) sum Just [1, 2, 3]
Just 6
我对以下内容的工作原理非常清楚:
这个问题显然很简单:
Prelude> fmap sum $ Just [1,2,3]
Just 6
我已经手动分解了(fmap . fmap)
以理解类型的工作原理。但是,当将其视为“两次提升”时,这并没有意义,因为我正在对Just和List数据构造函数进行提升。
我在ghci
中输入了以下内容:
Prelude> :t (fmap . fmap)
(fmap . fmap)
:: (Functor f, Functor f1) => (a -> b) -> f1 (f a) -> f1 (f b)
Prelude> :t (fmap . fmap) sum
(fmap . fmap) sum
:: (Num b, Foldable t, Functor f, Functor f1) =>
f1 (f (t b)) -> f1 (f b)
Prelude> :t (fmap . fmap) sum Just
(fmap . fmap) sum Just :: (Num b, Foldable t) => t b -> Maybe b
我不理解如何得出最后的输出结果。当将
(fmap . fmap) sum
作为输入并使用Just
数据构造函数时,编译器如何知道要替换f1
和f
都为Maybe
?在这里得到一个好答案之后,我应该如何自己找到答案呢?
(fmap . fmap)
中.
的定义,然后简化。注意你对fmap
的使用之一是将函数作为其第二个参数... - Carl