我正在尝试创建一个树,其中每个节点可以有0到2个子节点,并且叶子包含列表:
data Test aa = Leaf [aa] | Treenode (TTT aa) (TTT aa) | Empty deriving Show
例如,如果aa
为Int
,则离开将保留[Int]
。
如何编写接受此类数据的函数定义?我试过了:
f :: (aa -> aa) -> Test aa -> Test aa
这会产生错误:Couldn't match expected type 'aa' with actual type '[aa]'
因为Leaf [aa]
是列表而不是单个值。
我认为这不是问题因为函数接收类型Test
的参数而列表[aa]
是参数Test
的内容而不是参数本身,如果是有道理。
答案 0 :(得分:1)
数据类型应为:
data Test aa = Leaf [aa] | Treenode (Test aa) (Test aa) | Empty deriving Show
然后,例如,您可以使用树创建map
函数:
f :: (aa -> aa) -> Test aa -> Test aa
f _ Empty = Empty
f g (Leaf xs) = Leaf $ map g xs
f g (Treenode x y) = Treenode (f g x) (f g y)
Prelude> f (1+) (Treenode (Leaf [1,2]) (Leaf [3,4]))
Treenode (Leaf [2,3]) (Leaf [4,5])