Ich bin dabei, ein Projekt in Haskell zu erstellen, wo ich eine Funktion erstellen möchte, die zwei Listeneingaben und dann eine Union der Liste zurückgibt aber ohne Duplikate.Haskell "Konnte nicht den erwarteten Typ 'a' mit dem tatsächlichen Typ '[a0]'"
Das Problem ist, dass ich die Fehlermeldung erhalte:
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]
Hier ist mein Code:
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]
Die erste allList
Funktion erstellt eine Liste der beiden Liste, die checkDup
schafft ein neue Liste ohne Duplikate und die newList
verwendet Listenverständnis, um die kombinierte Liste an die checkDup
zu übergeben.
Wer weiß, wo ich falsch liege?
Drei kleinere Notizen, die ich hoffe, Sie Haskell lernen helfen: 1) 'allList' und' newList' benötigen keine ersten Fälle. 2) Sie brauchen 'Eq' nicht für die Mustererkennung, so dass' allList' nicht unbedingt die 'Eq a'-Bedingung benötigt. 3) Wenn Sie den unnötigen Code entfernen, den ich erwähnt habe, dann ist 'allList' einfach ein Alias für' (++) '. Sie könnten 'x ++ y' anstelle von' allList xy' in 'newList' schreiben und die' allList' Funktion löschen (es sei denn, die Übung erfordert es irgendwie, sie zu definieren und zu benutzen, oder wenn Sie denken, dass der Code lesbarer ist es). –