Я делаю проект на Haskell, где я пытаюсь создать функцию, которая принимает два входа списка, а затем возвращает объединение списка, но без каких-либо дубликатов.
Проблема в том, что я продолжаю получать сообщение об ошибке:
Couldn't match expected type ‘a’ with actual type ‘[t0]’
‘a’ is a rigid type variable bound by
the type signature for newList :: [a] -> [a] -> [a]
Вот мой код:
allList :: (Eq a) => [a] -> [a] -> [a]
allList [] [] = []
allList x y = (x ++ y)
checkDup [] = []
checkDup (z:zs)
| z `elem` zs = checkDup zs
| otherwise = z : checkDup zs
newList :: (Eq a) => [a] -> [a] -> [a]
newList [] [] = []
newList x y = [checkDup z | z <- allList x y]
Первая функция allList
создает список из двух списков, checkDup
создает новый список без каких-либо дубликатов, а newList
использует понимание списка для передачи объединенного списка в checkDup
.
Кто-нибудь знает, где я ошибаюсь?
allList
иnewList
не нужны их первые случаи. 2) Вам не нужноEq
для сопоставления с образцом, поэтомуallList
на самом деле не нужно ограничениеEq a
. 3) Если убрать ненужный код, о котором я говорил, тоallList
будет просто псевдонимом для(++)
. Вы можете написатьx ++ y
вместоallList x y
вnewList
и удалить функциюallList
(если упражнение каким-то образом не требует от вас ее определения и использования, или если вы считаете, что с ней код становится более читаемым). - person   schedule 14.04.2016