2014-12-04 3 views
5

Ich habe gerade angefangen, mit Haskell mit GHCI zu spielen. Die REPL kommt mit einer Reihe von eingebauten Funktionen. Zum Beispiel and und or, um boolesche Listen zu reduzieren [Bool] -> Bool. Es war für mich ziemlich überraschend, dass es für leere Listen gibt:Prelude "und" und "oder" Funktionen auf leeren Listen

Gibt es gute Gründe für ein solches Verhalten? Ich habe irgendwie gegenteilige Ergebnisse erwartet. Selbst False sieht in beiden Fällen für mich vernünftiger aus.

Antwort

9

In beiden Fällen sie das Identitätselement der Operation geben:

True && x == x 
False || x == x 

Für jede Operation, es ist die boolean, dass „nichts tut“, das es die perfekte Wahl macht zurückzukehren, wenn Sie nichts bekommen als ein Eingang!

Dies ist die gleiche Art und Weise, dass sum und product jeweils mit 0 und 1 beginnen.

+0

Danke. Nun, das macht Sinn. :) –

7

Dies ist leichter zu verstehen, wenn wir stattdessen über all, any :: (a -> Bool) -> [a] -> Bool sprechen. Intuitiv:

  1. all p sucht eine Liste zu finden, einen Gegen zum Prädikat p. Es gibt False wenn und nur wenn ein solches Gegenbeispiel gefunden wird.
  2. any p Durchsucht eine Liste nach einem Beispiel, das das Prädikat p erfüllt. Es gibt genau dann True zurück, wenn ein solches Beispiel gefunden wird.

Deshalb:

  1. all p [] wahr ist, weil die leere Liste keine Gegenbeispiele zu p enthält.
  2. any p [] ist false, weil die leere Liste keine Beispiele enthält, die erfüllen.

Beachten Sie, dass:

and == all id 
or == any id 

So erstreckt sich diese Argumentation zu and, or :: [Bool] -> Bool.

Beachten Sie, dass die mathematische Logik oft auch funktioniert wie folgt:

-- "All unicorns are Argentinian." 
∀x. unicorn(x) → argentinian(x) 

Dieser Satz ist wahr, wenn Einhörnern nicht existieren. Logische Neulinge werden auch dadurch verwirrt ...

+0

Danke. "Jede" und "jede" Analogie ist sehr nützlich. Ich dachte an diese Funktionen als eine "Falte". Verdammt, jetzt weiß ich nicht, wessen Antwort ist besser :) –