haskell установил тип данных

#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 самостоятельно.