Korrekte Methode zum Definieren einer Funktion in Haskell

7

Ich bin neu bei Haskell und probiere ein paar Tutorials aus. Ich habe dieses Skript geschrieben:

%Vor%

Ich habe dies als lucky.hs gespeichert und habe es im Interpreter ausgeführt und es funktioniert gut.

Aber ich bin unsicher bezüglich Funktionsdefinitionen. Es scheint von dem kleinen, das ich gelesen habe, dass ich die Funktion Glück wie folgt definieren konnte (Funktionsname ist lucky2):

%Vor%

Beide scheinen gleich gut zu funktionieren. Offensichtlich ist die Funktion lucky klarer zu lesen, aber ist lucky2 eine korrekte Art, eine Funktion zu schreiben?

    
Matvey Aksenov 01.01.2012, 13:29
quelle

2 Antworten

14

Sie sind beide richtig. Der erste ist wohl der idiomatische Haskell, weil er sein sehr wichtiges Feature namens pattern matching verwendet. In dieser Form würde es normalerweise geschrieben werden als:

%Vor%

Der Unterstrich zeigt an, dass Sie die genaue Form (Wert) Ihres Parameters ignorieren. Es interessiert Sie nur, dass es anders ist als 7 , das war das Muster, das Sie in Ihrer vorherigen Deklaration festgehalten haben.

Die Wichtigkeit der Mustererkennung wird am besten durch die Funktion veranschaulicht, die auf komplizierteren Daten wie Listen basiert. Wenn Sie zum Beispiel eine Funktion schreiben, die eine Länge der Liste berechnet, würden Sie wahrscheinlich mit einer Variante für leere Listen beginnen:

%Vor%

Die [] -Klausel ist ein Muster, das auf leere Listen gesetzt wird. Leere Listen haben offensichtlich eine Länge von 0, also haben wir unsere Funktion zurückgegeben.

Der andere Teil von len wäre der folgende:

%Vor%

Hier stimmen Sie mit dem Muster (x:xs) überein. Colon : ist der sogenannte Cons-Operator : Er fügt einen Wert zur Liste hinzu. Ein Ausdruck x:xs ist daher ein Muster, bei dem ein Element ( x ) an eine Liste angefügt wird ( xs ). Es entspricht insgesamt einer Liste mit mindestens einem Element, da xs auch eine leere Liste sein kann ( [] ).

Diese zweite Definition von len ist auch ziemlich einfach. Sie berechnen die Länge der verbleibenden Liste ( len xs ) und bei 1 die Länge, die dem ersten Element ( x ) entspricht.

(Die übliche Art, die obige Definition zu schreiben, wäre:

%Vor%

was wiederum bedeutet, dass es dir egal ist, was das erste Element ist, nur dass es existiert).

    
Xion 01.01.2012, 13:34
quelle
7

Eine dritte Möglichkeit, dies zu schreiben, wäre Wachen:

%Vor%

Es gibt keinen Grund, darüber verwirrt zu sein. Es gibt immer mehr als einen Weg, dies zu tun. Beachten Sie, dass dies auch dann zutrifft, wenn keine Mustererkennung oder Schutzfunktionen vorhanden sind und Sie für die Verwendung von if verwendet haben.

Alle Formulare, die wir bisher behandelt haben, verwenden sogenannte syntaktische Zucker von Haskell. Pattern-Wächter werden in normale Case-Ausdrücke sowie in mehrere Funktionsklauseln und if-Ausdrücke umgewandelt. Daher wäre vielleicht die niedrigste, nicht entzerrte Art, dies zu schreiben:

%Vor%

Obwohl es gut ist, dass Sie nach idiomatischen Wegen suchen, würde ich einem Anfänger empfehlen, dass er das verwendet, was für ihn am besten funktioniert, was auch immer er am besten versteht. Zum Beispiel, wenn man Punktfreiheit (noch) nicht versteht, gibt es keinen Grund, es zu erzwingen. Es wird früher oder später zu dir kommen.

    
Ingo 01.01.2012 14:48
quelle

Tags und Links