在Haskell中为树数据定义Map

时间:2014-05-03 12:37:17

标签: haskell map tree

我有一个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]

1 个答案:

答案 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)