-1

如何为通用 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

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

编辑:如何更通用的版本,避免使用列表?更多在这里

4

1 回答 1

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以获得类似的灵感。

于 2011-02-13T01:40:19.843 回答