Ein guter Freund von mir hat mir dieses seltene Verhalten des Mustervergleichs in Haskell einmal gezeigt.
%Vor%Das Ergebnis ist:
%Vor%Es fängt an, die Schnur zu drucken, aber hört nie auf, was ist los?
In let
s und Top-Level-Ausdrücke befindet sich alles auf der linken Seite von =
auf der rechten Seite. Sie haben also einen "unteren" Looping-Wert erstellt.
Beachten Sie, dass sich das genauso verhält:
%Vor% Das liegt daran, dass (vereinfacht) print
für String
etwas Ähnliches wie folgt definiert ist:
Da chars
eine Schleife ist, scheint die mapM_ putChar chars
zu hängen.
Das @"Hello"
ist hier irrelevant, es wird nur der Typ auf String
korrigiert. Sie erhalten das gleiche Verhalten mit
Was semantisch äquivalent zu
ist %Vor%gibt das Ergebnis
%Vor% Was ich unter "semantisch äquivalent" verstehe, sind sowohl s
als auch s'
Beispiele für bottom values , dh Werte aus dem "sin bin der Fehlerwerte, die jeder Typ enthält, dank Nicht-Strenge ". Sobald du einen unteren Wert erreichst, ist die reine Haskell-Sprache im Grunde machtlos und hat nachgegeben, nun, undefiniertes , "unreines Verhalten", wie dich ewig warten zu lassen oder eine Ausnahme auszulösen.
Aber auch dies muss nicht unbedingt passieren, weil es nicht streng ist. Beim Drucken eines Wertes wird zuerst die Instanz Show
aufgerufen und aufgefordert, eine Zeichenfolge zu erzeugen. Eine Haskell-Zeichenfolge ist eine faule Liste. Und die Zeichenfolge show
von any beginnt mit "
. Daher wird show
, selbst wenn die Zeichenfolge selbst völlig undefiniert ist, dieses eine Zeichen erzeugen.
Wir können das geschützter mit
beobachten %Vor%Tags und Links haskell pattern-matching