2016-12-04 38 views
0

我得到的数据结构映射在所述元件的给定函数需要为我的GTree数据结构编写这个函数,但是我无法编写它..现在我有这种功能:的Haskell在GTree的叶子

mapTree :: (a -> b) -> GTree a -> GTree b 
mapTree f (Gnode [a]) = Gnode [mapTree f a] 
mapTree f (Leaf a) = Leaf f 

有人可以帮我完成吗?或者至少解释我如何实现..

回答

4

你几乎在那里!你忘记处理子树列表中有多个元素的情况。模式[x]代表单元素列表。

我将匹配任意长(或短)的子树列表ts,然后使用map将递归调用应用于每个子树。

mapTree :: (a -> b) -> GTree a -> GTree b 
mapTree f (Gnode ts) = Gnode (map (mapTree f) ts) 
mapTree f (Leaf x) = Leaf (f x) 

NB。我知道这是一个练习,但在生产代码中,我会要求GHC使用DeriveFunctor语言扩展为我编写此函数。

{-# LANGUAGE DeriveFunctor #-} 

data GTree a = Leaf a | Gnode [GTree a] deriving Functor 

mapTree :: (a -> b) -> GTree a -> GTree b 
mapTree = fmap