Haskell: Nicht-strikte boolesche Operationen

7

Gibt es trotzdem eine Funktion wie die folgende in Haskell?

%Vor%

Ich habe derzeit keinen Anwendungsfall dafür (obwohl mich das interessieren würde), ich bin nur daran interessiert, ob es möglich ist.

    
Clinton 08.06.2012, 15:02
quelle

2 Antworten

12

Abhängig von Ihrer Bewertungsreihenfolge (der Reihenfolge, in der Sie die Werte prüfen) können Sie eine faule Version schreiben:

%Vor%

Tatsächlich wird sich die Standarddefinition in Haskell so verhalten, da Haskell eine faule Sprache ist.

Es gibt jedoch keine Möglichkeit, einen undefinierten Wert zu "überspringen", ohne zuerst den Wert zu betrachten, der ihn zu einem Tiefpunkt auswertet, was dazu führt, dass der Ausdruck nicht definiert ist.

Denken Sie daran, dass faule Werte Geschenke mit Geistern in sich tragen:

Wenn du in den Kasten schaust, könnte dich ein Geist erwischen.

Wenn es wichtig ist, nach Unterseiten zu suchen (z. B. als Teil einer Testsuite), können Sie sie als Ausnahmen behandeln und abfangen >. Aber Sie würden das nicht in einer reinen Funktion tun.

    
Don Stewart 08.06.2012, 15:06
quelle
15

Dies ist bei Standard-Haskell nicht möglich, kann aber mit einem unsicheren Trick, implementiert in der lub -Bibliothek, erfolgen Conal Elliott.

Grundsätzlich schreiben Sie zwei Funktionen:

%Vor%

und dann können Sie or a b als lub (die kleinste Obergrenze in Bezug auf die "Definiertheit" -Ordnung) von orL a b und orR a b definieren.

Operational führt es beide Berechnungen parallel aus und wählt die erste, die erfolgreich ist, die andere aus.

Obwohl das so funktioniert, wie Sie es vorgeschlagen haben, hat es wichtige Nachteile. Zuallererst ist lub nur sicher, wenn seine Argumente übereinstimmen (gleich, es sei denn unten). Wenn Sie lub True False verwenden, wird das Ergebnis nicht deterministisch sein und somit die Reinheit verletzen! Zweitens kann der Leistungsaufwand beim parallelen Ausführen beider Berechnungen dominant werden (versuchen Sie zum Beispiel, einen foldr or False einer großen Liste zu berechnen!).

    
Rotsor 08.06.2012 15:36
quelle

Tags und Links