Другая дилемма типа haskell

#haskell

#haskell

Вопрос:

Привет всем, я пытаюсь написать этот код, и у меня возникают проблемы с типами данных

 data Collection = Set [Int] deriving (Show)

remove :: Int -> Collection -> Collection
remove _ (Set []) = (Set [])
remove numberToRemove (Set (x:xs))
    |x == numberToRemove = (Set xs)
    |otherwise = Set ([x]:remove numberToRemove xs)
  

Я получаю эту ошибку, это проблема с типами:

  Couldn't match expected type `Int' with actual type `[t0]'
In the first argument of `(:)', namely `[x]'
In the first argument of `Set', namely
  `([x] : remove numberToRemove xs)'
In the expression: Set ([x] : remove numberToRemove xs)
Failed, modules loaded: none.
  

Любая помощь приветствуется
Спасибо

Комментарии:

1. Этот вопрос действительно бесполезно назван…

Ответ №1:

Первая проблема в выражении:

 Set ([x] : remove numberToRemove xs)
  

Заголовок списка (перед : ) должен быть Int , а не [Int], замените на:

 Set (x : remove numberToRemove xs)
  

Затем вторая проблема. В том же выражении подвыражение:

 remove numberToRemove xs
  

является коллекцией, но после оператора должен быть [Int] : итак, возможное решение:

 data Collection = Set [Int] deriving (Show)

col_to_list :: Collection -> [Int]
col_to_list (Set xs) = xs

remove :: Int -> Collection -> Collection
remove _ (Set []) = (Set [])
remove numberToRemove (Set (x:xs))
    |x == numberToRemove = (Set xs)
    |otherwise = Set (x : col_to_list (remove numberToRemove (Set xs)))