2013-03-31 13 views
9

In der Schule exerciceMuster in GHCi passend

Ich habe diese Funktion

bar :: Float -> Float -> Float 
bar x 0 = 0 
bar 0 y = 0 
bar x y = x * y 

ich es in GHC Typ als

let bar x 0 = 0; bar 0 y = 0; bar x y = x * y 

und bewerten

bar foo 0 
bar 0 foo 

Ich bin gebeten, die Leiste zu ändern, um '|' so möchte ich etwas tun:

let bar x y = | x 0 = 0 | 0 y = 0 | x y = x * y 

aber in GHCI Ich habe

parse error on input '=' 

Wie kann ich es in GHCi tun? Ändert sich durch die Verwendung der Mustererkennung ('|') etwas?

+1

Ihre ursprüngliche 'Leiste' verwendet Mustervergleich.Sie möchten etwas über [Wächter] erfahren (http://en.wikibooks.org/wiki/Haskell/Truth_values#Guards). – dave4420

+2

Sie könnten besonders clever sein und einfach "let bar |" schreiben sonst = (*) '... – leftaroundabout

+3

Entferne das' = 'vor dem ersten Wächter, 'let bar x y | x == 0 = ... | y == 0 = ... | sonst = ... '. –

Antwort

16

Schauen Sie sich die Syntax für die Verwendung Wachen:

bar x y | x == 0  = 0 
     | y == 0  = 0 
     | otherwise = x * y 

Geschrieben in einer Zeile in GHCi:

let bar x y | x == 0 = 0 | y == 0 = 0 | otherwise = x * y 
9

Verwenden Dateien

Geben Sie nicht Ihren Code direkt in GHCI es sei denn, es ist wirklich ein Einzeiler.

Speichern Sie Ihren Code in einer Textdatei namens PatternMatch.hs und laden Sie ihn in ghci, indem Sie eingeben.

:l PatternMatch.hs 

und dann, wenn Sie Änderungen vornehmen (und speichern) Sie die Datei in GHCI, indem Sie

:r 

Alternativ nachladen kann, können Sie Ihre Dateien benennen, nachdem die sie in sind, üben, oder einfach nur haben ein reusablle Temp.hs wenn es wirklich wegwerfcode ist.

Indem Sie Daten in einer Textdatei speichern, können Sie sie einfacher bearbeiten und wiederverwenden.

Module

Später werden Sie damit verbundenen Funktionen sammeln zusammen eine richtige Modul verwenden, so können sie Importeur in andere Programme sein. Zum Beispiel könnten Sie

module UsefulStuff where 

pamf = flip fmap 

in einer Datei namens UsefulStuff.hs und dann in einer anderen Datei gespeichert haben könnten Sie

import UsefulStuff 

und dann geben die Funktionen von UsefulStuff verwenden.

Module sind zu viel für das, was Sie gerade tun, aber den Arbeitsablauf des Bearbeitens, Speicherns, Neukompilierens, Tests, Wiederholens zu erhalten, werden Sie sich vor ziemlich viel Mühe ersparen.

+0

Willkommen im 21. Jahrhundert. Die Akten gehören in einen Schrank mit Messinggriff. In der heutigen Zeit, in der die coolen Kids ihren Code in JSFiddle plündern und auf den Run-Button springen oder sich in einer Swift-Sandbox herumtreiben, um diese sofort zu befriedigen, wird diese Antwort nicht viele potentielle Haskell-Programmierer gewinnen. Die wirklich coolen Kids gehen wahrscheinlich zu [Shen] (http://www.shenlanguage.org/), wo sie alle funktionalen Programmier- und Typprüfungs-Güte haben können, die sie wollen, und dann einige. Und oh ja, es hat eine REPL, die mehrzeilige Eingabe "out of the box" erlaubt, Signaturen und alle Typen eingibt. – ack

+1

@ack Ich denke, du verwechselst mich mit einer Person, die sich dafür interessiert, was coole Kinder tun, während es mir eigentlich nur darum geht, Leuten zu helfen, das meiste aus den Werkzeugen herauszuholen, die ich auch benutze. Danke für den Spam über Betrug. – AndrewC

+0

Wenn Sie so viel interessieren, könnten Sie vielleicht auf [diese Antwort] (http://stackoverflow.com/a/8443096/588561) verwiesen haben, die die Verwendung von Dateien nicht erfordert. – ack