Помощь в объявлении переменного количества аргументов - PullRequest
1 голос
/ 03 декабря 2010

High Guys,

Я должен определить полиморфный тип данных для дерева, которое может иметь несколько узлов.Каждый узел может иметь любое количество дочерних элементов и vlaue.Этот тип всегда будет иметь хотя бы один узел.Я новичок в Haskell, поэтому я спрашиваю, как я могу объявить узел с переменным количеством аргументов.

Это то, что у меня есть сейчас.Это дерево, которое может иметь узел или узел со значением (а) и двумя дочерними элементами дерева.Вместо двух детей дерева я хочу, чтобы они были любым числом детей дерева.(Analoog как java-переменная число аргументов "arg ...")

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

Спасибо за вашу помощь

EDIT

Небольшой вопрос::: Как я могу объявить этот узел с переменными аргументами в параметре функции (заголовок / подпись).Я должен реализовать функцию с именем
«содержит», которая будет проверять, содержит ли узел определенный элемент.

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

Правильна ли вторая строка?

1 Ответ

4 голосов
/ 03 декабря 2010

это будет:

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

но, кроме того, существует вторая проблема:

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

или такие, как части объединения, должны иметь разные имена, иначе вы не сможете использовать сопоставление с образцом

Leaf и Branch являются конструкторами данных, поэтому:

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)

или такой

...