#haskell
#haskell
Вопрос:
привет всем, я пытаюсь выяснить, как создать тип данных set в haskell, но я не могу понять это, это то, что у меня есть до сих пор, я немного смущен
data Set a = Node a | List {
list :: [a]
}deriving(Eq,Show,Ord)
insert :: Set Integer -> Set Integer -> Bool
insert (Node itemToInsert) (List list)
|contains (List list) (Node itemToInsert) == False = List(list:(Node itemToInsert))
contains :: Set Integer -> Set Integer -> Bool
contains (List []) (Node numberToFind) = False
contains (List (x:xs)) (Node numberToFind)
|x == (Node numberToFind) = True
|otherwise = contains (List (xs)) (Node numberToFind)
Спасибо за помощь!
Комментарии:
1. Мне нужен список узлов, и я не могу понять, как определить тип данных для этого.
2. Вы не можете указать «это список определенного конструктора»: используйте интеллектуальные конструкторы для чего-то подобного или используйте другой тип данных. Но почему вы пытаетесь определить новый тип данных Set, когда у нас есть Data.Set? И если вы хотите представить график (на который намекает «Узел»), то либо скажите об этом, либо используйте существующую библиотеку графиков!
3. Почему это было отклонено? Кажется честным вопросом
Ответ №1:
Из вашего кода кажется, вы уже поняли, что набор можно рассматривать как список без дубликатов. Итак, давайте выразим это в простом определении типа:
data Set a = Set [a]
Чтобы гарантировать отсутствие дубликатов, можно ввести «интеллектуальные конструкторы», которые представляют собой функции, которые технически не являются конструктором, но которые используются как таковые.
empty :: Set a
empty = Set []
Нам понадобится еще один для создания непустых наборов. Давайте посмотрим на вашу insert
функцию. Почему он возвращает Bool
? Разве он не должен возвращать set? Почему insert
ожидается два набора? Итак, чтобы вставить целое число в набор целых чисел, вы могли бы использовать следующую подпись типа:
insert :: Integer -> Set Integer -> Set Integer
Реализация состоит из двух случаев: 1. заданное целое число отсутствует в заданном наборе, и 2. заданное целое число находится в заданном наборе.
insert x (Set xs)
| not (x `elem` xs) = Set (x:xs)
| otherwise = Set xs
Поскольку этот вопрос, похоже, является частью домашнего задания. Я бы сказал, что вы должны попытаться выяснить, как реализовать elem
самостоятельно.