2016-07-08 4 views
1

Ich begann Haskell zu studieren, um mich auf das nächste Semester vorzubereiten (ich habe es Anfang des letzten Semesters fallen gelassen), und ich habe erfolgreich einige grundlegende Funktionen geschrieben. Das Thema, das ich gerade überprüfe, ist Lists, und ich brauche Hilfe, um eine sehr einfache Funktion namens cons8 zu schreiben, die ein Argument akzeptiert, das eine Liste ist und eine 8 zum Anfang einer solchen Liste hinzufügt. Mein Problem ist, dass ich festhalte, wie man eine Liste als Argument der Funktion einfügt und wie man sich darauf im Körper der Funktion bezieht. Ich denke, dass ich die Art definieren können wie folgt und dann die Funktion schreiben:Eine Funktion schreiben, die eine Liste als Argument akzeptiert

cons8 :: [a] -> [a] 

Ich werde sehr schätzen Ihre Hilfe mein Problem zu lösen.

+0

Ihre Typ-Signatur schlägt vor, dass "cons8" mit Listen beliebigen Typs arbeiten kann, aber wenn Sie eine "8" in die Liste einfügen möchten, muss es sich um eine Liste von Zahlen handeln. – sepp2k

+0

Dies ist wahrscheinlich ein Duplikat, aber es ist sowieso eine einfache Antwort: Sie müssen zwei Definitionen unter die es Muster passt, eins für leere Liste und eins für nicht, zwei Zeilen: 'cons8 [] = (Ihr leerer Fallcode hier) ',' cons8 (x: xs) = (nicht leerer Fall, x Muster passt zum Kopf und ist vom Typ a, xs zum Rest der Liste und ist Typ [a]) '. 'cons8' würde keinen leeren Kasten benötigen, ich hoffe, du kannst verstehen, warum - es manipuliert nicht den Kopf, sondern macht einfach etwas mit der Liste selbst. –

+0

Die einfache Antwort in einer Zeile besteht darin, die Infix-Funktion in ein Präfix umzuwandeln, um das Curry-Verfahren zu nutzen (ich denke, das ist die korrekte Terminologie). 'cons8 = (:) 8' –

Antwort

6

Erstens, ausgehend von der Art ist in der Tat ein guter Anfang.

Lassen Sie uns den Typ überprüfen:

cons8 :: [a] -> [a] 

Hier a jeder Art sein kann. Der obige Typ verspricht, dass der Aufrufer cons8 mit einer beliebigen Liste verwenden kann: eine Liste von Ganzzahlen, eine Liste von Zeichen, eine Liste von Booleschen Werten usw. Da wir 8 vorangestellt haben und Listen desselben Typs enthalten, können wir sehen dass der obige Typ zu allgemein ist. Lassen Sie uns etwas weniger allgemeines verwenden, z.

cons8 :: [Int] -> [Int] 

Jetzt, wie man ein Listenargument nimmt. Das ist wichtig: Sie nehmen ein Listenargument wie jedes andere Argument.

cons8 x = ???? -- TODO 

Ein häufiger Fehler ist hier cons8 [n] = ... zu schreiben, da es sich um eine Liste ist. Tu das nicht! [n] ist eine Liste, aber eine ganz besondere: eine Liste mit nur einem Element (n). Wir wollen nicht nur mit Ein-Element-Listen umgehen, wir wollen cons8 mit beliebigen Liste arbeiten. Also, keine Klammern: Lassen Sie x das ganze Listenargument sein.

Dann können wir gelten nur die Nachteile Betreiber:

cons8 x = 8 : x 

Natürlich können wir x einen beliebigen anderen Namen umbenennen, zum Beispiel

cons8 list = 8 : list 

würde auch funktionieren.

Wenn Sie im Voraus in Haskell bekommen, werden Sie wahrscheinlich über Abschnitte lernen werden, und es vorziehen, den folgenden Code

cons8 = (8 :) 

Tatsächlich ist (8 :) so kurz, dass Sie in der Regel eine cons8 Funktion vermeiden definieren und seine direkt verwenden Definition.

+2

Nur ein kleiner Stil Punkt, würde ich 'Cons8 xs = 8: xs' verwenden, um anzuzeigen, dass es eine Liste ist –

+0

Große Erklärung. Ich bin sehr dankbar. – user3059248