Ich konnte den folgenden Code fehlerlos ausführen
%Vor%, aber ich erhalte diesen Fehler Couldn't match expected type 'a' with actual type '[a]'. 'a' is a rigid type variable bound by the type signature for myLast :: [a] -> a
für den folgenden Code:
Ich bin ein Anfänger in Haskell und die Fehlermeldung ist zu griechisch und lateinisch für mich. Soweit ich das verstehe, kann der Compiler den Typ im zweiten Fall nicht ableiten. Kann mich jemand darauf hinweisen, was hier eigentlich passiert?
Sie deklarieren die Eingabe als eine Liste vom Typ [a]
und den Rest als a
.
Eine Liste vom Typ a
in Haskell besteht aus einem Kopf vom Typ a
und einem Tail, einer Liste vom Typ [a]
. Der Konstruktor :
nimmt den Kopf und den Schwanz als Argumente.
Wenn Sie eine Liste als (x:y)
dekonstruieren, ist x
der Kopf und y
ist der Tail. In Ihrem zweiten Codefragment binden Sie also das tail der Liste mit dem Listentyp [a]
, wenn Ihre Typignatur erfordert, dass Sie einen Wert vom Typ a
(der Kopf ist ein Beispiel).
Wenn Sie wissen, was :
wirklich ist, hilft das bei der Entschlüsselung der Fehlermeldung. :
kann als eine Funktion betrachtet werden, die ein Element und eine Liste übernimmt und eine Liste zurückgibt, deren erstes Element das erste Argument und der Rest das zweite Argument ist, oder:
Um zu Ihrer Funktion zu gelangen, haben Sie myLast :: [a] -> a
; Der Typ von myLast (_:x) = x
ist jedoch myLast :: [a] -> [a]
, da das zweite Argument von :
(das Sie x
genannt haben) selbst eine Liste ist.
Außerdem solltest du, wenn du etwas in Haskell nicht verstehst, im Allgemeinen zuerst auf den Typ achten, indem du :t
in GHCI verwendest.
(_:x)
entspricht _ mit dem Kopf und x mit dem Ende der Liste. Die Art des Schwanzes einer Liste ist [a]. Sie versuchen, [a] zurückzugeben, wo die Funktionsdeklaration den Rückgabetyp als a angibt.
Wenn Sie das letzte Element abgleichen möchten, werfen Sie einen Blick auf diese Antwort - Können Sie mit dem Mustervergleich das letzte Element einer Liste binden?
Tags und Links haskell