树的广义折叠函数?

时间:2011-02-13 01:19:30

标签: haskell tree fold

如何为泛型Haskell树编写通用的foldr函数?

data (Eq a, Show a) => Tree a = Void | Node a [Tree a]
    deriving (Eq, Show)

treefold :: (Eq a, Show a) => (a -> [b] -> b) ->  b -> Tree a -> b

我坚持第一个参数定义......

编辑:更通用的版本怎么样,避免使用列表? More here

1 个答案:

答案 0 :(得分:1)

data Tree a = Void | Node a [Tree a]
    deriving (Eq, Show)

实例上下文不是必需的; deriving会做正确的事情(创建instance (Eq a) => Eq (Tree a)instance (Show a) => Show (Tree a))。

您的类型签名看起来很好,并且可以自然地实现。

treefold :: (a -> [b] -> b) ->  b -> Tree a -> b
treefold _ k Void = k
treefold f k (Node a ts) = f a $ map (treefold f k) ts

请参阅Data.Traversable了解相似的灵感。