Zunächst ist die Art Signatur fehlerhaft.
deleteAllInstances :: (a, [l]) => a -> [l] -> [l]
Eine Art Unterschrift hat die Form
name :: (Constraints) => type
wo Constraints
Typklassen beinhalten, wie (Ord a, Show a)
. In diesem Fall verwendet die Funktion (==)
, daher muss eine Einschränkung der Form vorliegen.
Dann stimmt die Funktionsdefinition nicht mit dem Typ Teil überein, Sie haben sie definiert, um ein Paar als Argument zu verwenden, während die Typ-Signatur das Gegenteil sagt (Ihre Definition ist nicht Curritiert, der Typ ist curried).
deleteAllInstances (a, []) = []
deleteAllInstances (i, (x:xs))
| i == x = tail
| otherwise = x ++ tail
where tail = deleteAllInstances i xs
dann verwenden Sie (++)
ein Element der Vorderseite einer Liste zu kleben, aber (++)
verkettet zwei Listen, müssen Sie (:)
hier.
Der einfachste Weg, um die Funktion definieren würde filter
deleteAllInstances :: Eq a => a -> [a] -> [a]
deleteAllInstances a xs = filter (/= a) xs
aber wenn man sich die explizite Rekursion tun wollen benutzen,
deleteAllInstances :: Eq a => a -> [a] -> [a]
deleteAllInstances a (x:xs)
| a == x = rest
| otherwise = x : rest
where
rest = deleteAllInstances a xs
deleteAllInstances _ _ = []
Welchen Fehler bekommen Sie? –