2010-02-08 9 views

Antwort

10

Haskell-Wächter können als eine stückweise über den Eingang definierte mathematische Funktion betrachtet werden.

foo x | x < 0 = bar 
     | x < 5 = baz 
     | x < 20 = quux 
     | otherwise = quaffle 

würde wie von einem Mathematiker geschrieben werden:

foo(x) = { bar, if x < 0 
      baz, if x >= 0 && x < 5 
      quux, if x >= 5 && x < 20 
      quaffle, if x >= 20 

Jeder der Wache in einer Haskell-Funktion trägt implizit die Negation aller von den Wachen, die es vorangehen, weil sie einen nach dem versucht werden andere.

Haskell entscheidet sich, den Schutz auf der linken Seite des Gleichheitszeichens zu schreiben, um den Kontrollfluss zu vereinfachen. Wenn Sie das | als "so dass" wird es dann ziemlich intuitiv.

+0

Also, seine Art von wie Ausführen einer Funktion auf eine Bedingung, dass ... und abhängig von der Bedingung wird nur die Funktion ausführen, wo die Bedingung wahr ist, und alle vorherigen Bedingungen wurden falsch? Recht? –

+0

"quaffle" ... das ist ein neues für mich: D –

+1

Ich las das "|" als "wenn": 'foo x, wenn x <0, = bar ... wenn x <5, = baz 'und so weiter. Nicht mit "wenn" zu verwechseln. – Nefrubyr

4

Eine geschützte Gleichung ist das Haskell-äquivalente Konstrukt einer piecewise function.

8

Eine geschützte Gleichung ist eine Gleichung (eine Aussage über eine Gleichheit), die eine sogenannte Fallunterscheidung beinhaltet. Ein Beispiel ist:

fac :: Integer -> Integer 
fac n | n > 0  = n * fac (n - 1) 
     | otherwise = 1 

Dies ist eine Definition des factorial function. Mathematikern schreiben würde,

Latex

0! = 1, per Definition. Für alle Werte n größer als , n! kann in (n - 1) definiert werden!. Dies ist bei 0 nicht der Fall!. Aus diesem Grund müssen zwei Fälle unterschieden werden. Und das ist es, was eine bewachte Gleichung tut.