我有一个Tree
数据结构,如下所示:
data Tree a = ATree a [Tree a]
deriving Show
是否可以使用以下声明编写高阶函数traverse
,该声明只是遍历(或者不管)树并重构它?
traverse :: (a -> b) -> Tree a -> Tree b
请注意traverse
的签名。它没有获得树的列表。它一次只接受一个节点。
我认为签名需要更改为接受列表才能执行此操作。像这样:
traverse :: (a -> b) -> [Tree a] -> [Tree b]
答案 0 :(得分:7)
traverse :: (a -> b) -> Tree a -> Tree b
traverse f (ATree e l) = ATree (f e) (map (traverse f) l)
请注意,您的功能与fmap
具有相同的签名,因此您应为您的类型实施Functor
:
instance Functor Tree where
fmap f (ATree e l) = ATree (f e) (fmap (traverse f) l)
实际上你可以让编译器为你生成你的仿函数实例:
{-# LANGUAGE DeriveFunctor #-}
data Tree a = ATree a [Tree a] deriving (Show, Functor)