小编jav*_*nor的帖子

为什么这个实现是可折叠类型类的一个坏实例?

我正在阅读精彩的Haskell Book。在 Traversable 一章(21)的最后,我需要为以下 Tree 编写一个实例:

data Tree a =
    Empty
  | Leaf a
  | Node (Tree a) a (Tree a)
Run Code Online (Sandbox Code Playgroud)

这是我的解决方案的完整代码链接。练习建议尝试同时实现foldMapfoldr。这就是我的实现方式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 typeclass quickcheck foldable typeclass-laws

7
推荐指数
1
解决办法
99
查看次数

为什么`(fmap.fmap)中的类型总和只是[1,2,3]`工作?

我正在享受我生命中的时间从最初的原则阅读精彩的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)

haskell

6
推荐指数
2
解决办法
164
查看次数