定义一个看似简单的可折叠实例

Den*_*gan 1 haskell typeclass

这个数据类型的Foldable实例是什么样的?

data X t = X t [X t]
Run Code Online (Sandbox Code Playgroud)

我试过这个:

instance Foldable X where
    foldMap f (X x xs) = f x `mappend` foldMap f xs
Run Code Online (Sandbox Code Playgroud)

但得到了这个错误:

Occurs check: cannot construct the infinite type: a = X a
When generalising the type(s) for `foldMap'
In the instance declaration for `Foldable X'
Run Code Online (Sandbox Code Playgroud)

sth*_*sth 6

xs是一个项目列表,foldMap需要应用于单个项目,而不是列表本身.这样做map会给出一个结果列表,可以与mconcat以下内容结合使用:

instance Foldable X where
  foldMap f (X x xs) = f x `mappend` mconcat (map (foldMap f) xs)
Run Code Online (Sandbox Code Playgroud)