如何为通用 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
我坚持第一个参数定义......
编辑:如何更通用的版本,避免使用列表?更多在这里
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以获得类似的灵感。