2010-08-08 19 views
7

Es ist diese Funktion Index in "Erlang Programming":Warum wird "wann" in dieser Funktion verwendet?

index(0, [X|_]) -> X; 
index(N, [_|Xs]) when N>0 -> index(N-1, Xs) 

Ist das nicht der Wächter "wenn N> 0" überflüssig, weil der Musterabgleich? Der Aufruf des Index (0, Liste) wird niemals in der zweiten Klausel enden, also wird N immer> 0 sein. Oder liege ich hier völlig falsch?

+0

Ich kenne Erlang nicht (nur OCaml), also werde ich es als Kommentar hinterlassen: Welches Muster würde N == - 1 entsprechen Meine Vermutung wäre die zweite (wenn es nicht für die Wache war) –

+0

Rune FS , Das war mein erster Gedanke auch, aber Index (-1, [1,2,3]) führt zu "** Ausnahmefehler: keine Funktionsklausel Übereinstimmungstest: Index (-1, [1,2,3])" –

+0

aber wenn du den Schutz entfernst passt das nicht dann? –

Antwort

12

Die Funktion funktioniert korrekt für N> = 0. Ohne einen Wächter, für N < 0 würde es die ganze Liste durchlaufen:

Index (-2, [1,2,3]) -> Index (-3, [2,3]) -> ... -> Index (-5, []) -> Fehler.

Das ist kein großes Problem, nur Sie könnten eine verwirrende Ausnahme bekommen. In Sprachen mit unendlichen Listen (Haskell, Ocaml) kann das Vergessen dieses Wächters zur Endlosschleife führen: index (-1, [0,0,0 ..]).

6

Die when-Klausel schützt vor negativen Indizes (edit: siehe Kommentare zur ursprünglichen Frage;).

5

Es gibt auch klareren Code, wie Sie explizit sagen, wenn diese Klausel gültig ist, nicht nur standardmäßig. Ja, ich weiß, dass dies in einigen (vielen) Fällen nicht möglich ist, da der Test sehr komplex werden kann oder eine Art von Standardfall gewünscht wird. Aber nicht hier.

Verwandte Themen