如何声明可以保存单值或列表值的数据类型的函数?

时间:2016-11-02 10:25:58

标签: haskell

我正在尝试创建一个树,其中每个节点可以有0到2个子节点,并且叶子包含列表:
data Test aa = Leaf [aa] | Treenode (TTT aa) (TTT aa) | Empty deriving Show
例如,如果aaInt,则离开将保留[Int]

如何编写接受此类数据的函数定义?我试过了:
f :: (aa -> aa) -> Test aa -> Test aa
这会产生错误:Couldn't match expected type 'aa' with actual type '[aa]'因为Leaf [aa]是列表而不是单个值。

我认为这不是问题因为函数接收类型Test的参数而列表[aa]是参数Test的内容而不是参数本身,如果是有道理。

1 个答案:

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