首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >折叠式树木

折叠式树木
EN

Stack Overflow用户
提问于 2013-11-15 12:47:35
回答 1查看 397关注 0票数 0

我对树的定义如下

代码语言:javascript
复制
 data Tree a = Leaf a
           | Node [Tree a] 
     deriving (Show)

以及以下可折叠的实例:

代码语言:javascript
复制
 instance Foldable (Tree) where
 foldMap f (Leaf t) = (f t)
 foldMap f (Node t) = (foldMap `mappend` (foldMap f) t)     

这段代码会抛出我和错误

代码语言:javascript
复制
 Couldn't match type `a' with `Tree a'
  `a' is a rigid type variable bound by
      the type signature for
        foldMap :: Monoid m => (a -> m) -> Tree a -> m
      at trees.hs:8:5
 Expected type: [a]
   Actual type: [Tree a]

如何使t在Tree类型的实例声明中而不是在一个实例声明中?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-15 12:55:53

(我假设您在实例声明中缩进了代码,否则编译器会抱怨这一点。)

问题就在眼前:

代码语言:javascript
复制
 foldMap f (Node t) = (foldMap `mappend` (foldMap f) t)

什么是(foldMap mappend .)该怎么做?您将foldMap本身视为一个一元值。我认为你想做的只是foldMap (foldMap f) t

顺便说一下,GHC可以自动为您导出可折叠的实例(以及函子和可遍历的实例)。只管写

代码语言:javascript
复制
{-# LANGUAGE DeriveFunctor, DeriveFoldable #-}
data Tree a = Leaf a
            | Node [Tree a]
  deriving (Show, Functor, Foldable)
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20001456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档