Haskell seltener Mustervergleich

7

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?

    
Damian Lattenero 12.05.2017, 19:59
quelle

2 Antworten

8

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:

%Vor%

Da chars eine Schleife ist, scheint die mapM_ putChar chars zu hängen.

    
jberryman 12.05.2017, 20:13
quelle
10

Das @"Hello" ist hier irrelevant, es wird nur der Typ auf String korrigiert. Sie erhalten das gleiche Verhalten mit

%Vor%

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%     
leftaroundabout 12.05.2017 20:18
quelle

Tags und Links