我正在阅读精彩的Haskell Book。在 Traversable 一章(21)的最后,我需要为以下 Tree 编写一个实例:
data Tree a =
Empty
| Leaf a
| Node (Tree a) a (Tree a)
Run Code Online (Sandbox Code Playgroud)
这是我的解决方案的完整代码的链接。练习建议尝试同时实现foldMap和foldr。这就是我的实现方式foldr(没有考虑调用顺序):
foldr _ z Empty = z
foldr f z (Leaf x) = f x z
foldr f z (Node left x right) =
f x $ foldr f (foldr f z left) right
Run Code Online (Sandbox Code Playgroud)
然后我实现foldMap如下:
foldMap f Empty = mempty
foldMap f (Leaf x) = …Run Code Online (Sandbox Code Playgroud) 我正在享受我生命中的时间从最初的原则阅读精彩的Haskell编程,并且我通过以下示例来看,我只是无法拆开(Page 1286电子阅读器):
Prelude> (fmap . fmap) sum Just [1, 2, 3]
Just 6
Run Code Online (Sandbox Code Playgroud)
对我来说很明显以下是如何工作的:
Prelude> fmap sum $ Just [1,2,3]
Just 6
Run Code Online (Sandbox Code Playgroud)
我已经手动解构,(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 …Run Code Online (Sandbox Code Playgroud)