Dlaczego Haskell ma wbudowaną funkcję if/then/else
zależną od Bool
typu zamiast prostej funkcji bibliotecznej? Jak na przykład
if :: Bool -> a -> a -> a
if True x _ = x
if False _ y = y
Dlaczego Haskell ma wbudowaną funkcję if/then/else
zależną od Bool
typu zamiast prostej funkcji bibliotecznej? Jak na przykład
if :: Bool -> a -> a -> a
if True x _ = x
if False _ y = y
Odpowiedzi:
Jest to czysto dla cukru z ładnym if
, then
i else
słowa kluczowe; w rzeczywistości GHC (z RebindableSyntax
włączonym rozszerzeniem) usunie składnię, po prostu wywołując dowolną ifThenElse
funkcję w zakresie.
Nie ma to większego znaczenia ... dla mnie wygląda to tak, jakby / to / else nie jest obecnie używane bardzo często. Stwierdzam, że piszę strażników wzorców zamiast… czy… jeszcze.
Z syntaktycznego punktu widzenia miło jest jednak mieć
if expr1 then expr2 else expr3
Więc możesz pisać
if foo a then bar b else baz c
zamiast
if (foo a) (bar b) (baz c)
co wydaje mi się zbyt LISPish.
Do analizy semantycznej i generowania kodu miło jest mieć tę konstrukcję, którą można łatwo skompilować do wydajnego kodu maszynowego. Zauważ, że kod może pominąć część, która powoduje, że gałąź nie jest osiągnięta, w przeciwieństwie do wywołania funkcji, w którym muszą zostać przekazane wszystkie (nieocenione) parametry. Ale stworzenie czasu jest również kosztowne (i pamięć, którą należy odzyskać później). Aby temu zaradzić, należałoby wszędzie wstawić funkcję if.