如何为泛型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
答案 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了解相似的灵感。