Haskell将给定函数映射到GTree叶上的元素上

Haskell将给定函数映射到GTree叶上的元素上,haskell,Haskell,我得到了一个数据结构: data GTree a = Leaf a | Gnode [GTree a] 以及针对不同数据结构的映射函数示例: data Tree a = Nil | Node a (Tree a) (Tree a) deriving (Eq,Ord,Show,Read) mapTree :: (a-> b) -> Tree a -> Tree b mapTree Nil = Nil mapTree f (Node x t1 t2) = Node (f x)

我得到了一个数据结构:

data GTree a = Leaf a | Gnode [GTree a]
以及针对不同数据结构的映射函数示例:

data Tree a = Nil | Node a (Tree a) (Tree a) deriving (Eq,Ord,Show,Read)

mapTree :: (a-> b) -> Tree a -> Tree b
mapTree Nil = Nil
mapTree f (Node x t1 t2) = Node (f x) (mapTree f t1) (mapTree f t2)
我需要为我的GTree数据结构编写这个函数,但我做不到。。现在我有这样的功能:

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

有人能帮我完成吗?或者至少向我解释一下如何实施..

你就快到了!您忘记处理子树列表中有多个元素的情况。模式
[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)
注意。我知道这是一个练习,但在生产代码中,我会要求GHC使用
DeriveFunctor
语言扩展为我编写此函数

{-# LANGUAGE DeriveFunctor #-}

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

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

你快到了!您忘记处理子树列表中有多个元素的情况。模式
[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)
注意。我知道这是一个练习,但在生产代码中,我会要求GHC使用
DeriveFunctor
语言扩展为我编写此函数

{-# LANGUAGE DeriveFunctor #-}

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

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