Warum hat Haskell eine eingebaute if/then/else
, typabhängige Bool
, anstatt eine einfache Bibliotheksfunktion? Sowie
if :: Bool -> a -> a -> a
if True x _ = x
if False _ y = y
Warum hat Haskell eine eingebaute if/then/else
, typabhängige Bool
, anstatt eine einfache Bibliotheksfunktion? Sowie
if :: Bool -> a -> a -> a
if True x _ = x
if False _ y = y
Antworten:
Es ist rein für den schönen Zucker von den if
, then
und else
Schlüsselwort; Tatsächlich wird GHC (mit RebindableSyntax
aktivierter Erweiterung) die Syntax desugarisieren, indem einfach die ifThenElse
Funktion aufgerufen wird, die sich im Gültigkeitsbereich befindet.
Es macht nicht viel aus ... für mich sieht es so aus, als würde / dann / sonst heutzutage nicht sehr oft verwendet. Ich schreibe Pattern Guards anstelle von if .. then .. else.
Aus syntaktischer Sicht ist es jedoch schön zu haben
if expr1 then expr2 else expr3
Du kannst also schreiben
if foo a then bar b else baz c
anstatt
if (foo a) (bar b) (baz c)
das sieht mir ein bisschen zu lissisch aus.
Für die semantische Analyse und Codegenerierung ist es schön, dieses Konstrukt zu haben, das leicht zu effizientem Maschinencode kompiliert werden kann. Beachten Sie, dass der Code im Gegensatz zu einem Funktionsaufruf, bei dem alle (nicht ausgewerteten) Parameter übergeben werden müssen, den Teil überspringen kann, der den Thunk für den Zweig erstellt, der nicht erreicht wird. Es kostet aber auch Zeit (und Speicher, der später wiederhergestellt werden muss), um den Thunk zu erstellen. Um dies wieder gut zu machen, müsste man die if-Funktion überall einbinden.