帮助声明可变数量的参数

时间:2010-12-03 01:57:16

标签: haskell variadic polyvariadic

高人,

我必须为可以有多个节点的树定义多态数据类型。每个节点可以有任意数量的子节点和值。此类型始终至少有一个节点。我是Haskell的新手,所以我问我怎么能声明节点有可变数量的参数。

这就是我现在所拥有的。这是一棵树,可以有一个节点或一个带有值(a)的节点和两个树子节点。而不是两个树儿,我希望他们成为任何数量的树儿。 (Analoog作为java变量数量的参数“arg ...”)

data Tree a = Node a | Node a (Tree a) (Tree a) deriving (Show)

感谢您的帮助

修改

一个小问题:::我如何在函数中使用变量参数声明此节点 参数(报头/签名)。我必须实现一个名为
的函数 “contains”将检查Node是否包含特定元素。

contains :: Tree a -> b -> Bool
contains (Node val [(tree)]) =   ......

第二行是否正确?

1 个答案:

答案 0 :(得分:4)

它将是:

data Tree a = Node a | Node a [(Tree a)] deriving (Show)

但另外还有第二个问题,那应该是

data Tree a = Leaf a | Branch a [(Tree a)] deriving (Show)

或者诸如union的部分必须具有不同的名称,否则您将无法使用模式匹配

LeafBranch是数据构造函数,所以:

Branch 1 [Leaf 3, Branch 6 [Leaf 5]]

Tree

的示例
contains :: Tree a -> a -> Boolean 
contains (Leaf a) b = a == b
contains (Branch a c) b = a == b || any (map (\t -> contains t b) c)

或者这样的