2013-11-15 133 views
0

我的樹可摺疊和樹

data Tree a = Leaf a 
      | Node [Tree a] 
    deriving (Show) 

以下定義和可摺疊以下實例:

instance Foldable (Tree) where 
foldMap f (Leaf t) = (f t) 
foldMap f (Node t) = (foldMap `mappend` (foldMap f) t)  

此代碼拋出我和錯誤

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] 

怎麼辦我在類型樹a的實例聲明中使用t而不是?

回答

7

(我假設你是縮進實例聲明中的代碼,否則編譯器會抱怨這一點。)

的問題是在該行:

foldMap f (Node t) = (foldMap `mappend` (foldMap f) t) 

是什麼(foldMap`mappend` ...)應該這樣做?您將foldMap本身視爲單值。我認爲你想要做的只是foldMap (foldMap f) t

順便說一下,GHC可以自動爲您導出可摺疊實例(以及函數和可穿越)。只寫

{-# LANGUAGE DeriveFunctor, DeriveFoldable #-} 
data Tree a = Leaf a 
      | Node [Tree a] 
    deriving (Show, Functor, Foldable)