Frage

Ich folge ein Tutorial. (Real World Haskell)

Und ich habe einen Anfänger Frage über Kopf und Schwanz auf leere Listen genannt. In GHCi es gibt Ausnahme

Intuitiv Ich glaube, ich würde sagen, dass sie beide sollten eine leere Liste zurück. Könnten Sie mir korrekt? Warum nicht ? (Soweit ich in OzML erinnere links oder rechts von einer leeren Liste gibt nil zurück)

Ich habe noch sicher nicht zu diesem Thema im Tutorial, aber es ist nicht eine Quelle für Fehler (wenn keine Argumente bereitstellt)? Ich meine, wenn überhaupt eine Funktion eine Liste der Argumente zu übergeben, die Optionnal sein kann, so dass sie mit dem Kopf lesen kann zu einem Fehler führen?

Ich weiß nur, das GHCi Verhalten, ich weiß nicht, was beim Kompilieren geschieht.

War es hilfreich?

Lösung

  

Intuitiv würde ich denken, sagen, dass sie beide sollten eine leere Liste zurück. Könnten Sie mir korrekt? Warum nicht?

Nun - head ist [a] -> a. Es gibt das einzelne, erstes Element; keine Liste.

Und wenn es kein erstes Element wie in einer leeren Liste? Nun, was zurück? Sie können keinen Wert vom Typ a aus dem Nichts schaffen, so alles, was bleibt undefined ist - ein Fehler.


Und tail? Schwanz im Grunde eine Liste ohne sein erstes Element - das heißt ein Element kürzer als das Original. Sie können diese Gesetze nicht aufrechterhalten, wenn kein erstes Element ist.

Wenn Sie aus einer Box einen Apfel nehmen, können Sie das gleiche Feld nicht haben (was bei tail [] == [] geschehen). Das Verhalten hat undefined zu sein.


Dies führt zu folgendem Ergebnis:

  

Ich habe noch sicher nicht zu diesem Thema im Tutorial, aber nicht ist es eine Quelle von Fehlern? Ich meine, wenn überhaupt eine Funktion eine Liste der Argumente zu übergeben, die Optionnal sein kann, so dass sie mit dem Kopf lesen kann zu einem Fehler führen?

Ja, es ist eine Quelle von Fehlern, sondern weil es erlaubt fehlerhaften Code zu schreiben. Code, der versucht, im Grunde um einen Wert zu lesen, der nicht existiert. Also:. * Nicht immer verwendet Kopf / Schwanz ** - Verwenden Sie Musterabgleich

sum     [] = 0
sum (x:xs) = x + sum xs

Der Compiler kann Garantie , dass alle möglichen Fälle abgedeckt sind, werden die Werte immer definiert und es ist viel sauberer zu lesen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top