Dlaczego Haskell ma wbudowane „if / then / else” zamiast definiować go jako prostą funkcję biblioteki?

25

Dlaczego Haskell ma wbudowaną funkcję if/then/elsezależną od Booltypu zamiast prostej funkcji bibliotecznej? Jak na przykład

if :: Bool -> a -> a -> a
if True  x _ = x
if False _ y = y
Petr Pudlák
źródło
4
Sądzę, że wyraźnie chcieli składni if ​​/ then / else, której nie mogliby uzyskać bez funkcji mixfix, takich jak w agdzie. Funkcja, o której mówisz, ma strukturę trójskładnikową, którą możesz wdrożyć samodzielnie, ale przypuszczam, że dali nam jeśli / to / jeszcze cukier (to prawdopodobnie tylko cukier w skrzynce) tylko dlatego, że mogli i jest nieszkodliwy .. Ale ja nie mam nic poprzeć mnie tutaj, dlatego piszę to w komentarzu.
Jimmy Hoffa
10
Może to być oczywiste dla większości czytelników, ale chciałbym zauważyć, że posiadanie funkcji „f / then / else” nie byłoby dobrym rozwiązaniem w chętnym języku (np. Schemat lub sml), podczas gdy jest to rozsądne w leniwym język jak Haskell.
Giorgio

Odpowiedzi:

24

Jest to czysto dla cukru z ładnym if, theni elsesłowa kluczowe; w rzeczywistości GHC (z RebindableSyntaxwłączonym rozszerzeniem) usunie składnię, po prostu wywołując dowolną ifThenElsefunkcję w zakresie.

Płomień Pthariena
źródło
6

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.

Ingo
źródło
3
Nie sądzę, aby inlinizacja była faktycznym problemem. Rozumiem, że GHC jest już wyjątkowo dobry we wprowadzaniu małych funkcji, ponieważ jest to tak powszechny wzorzec w Haskell.
Tikhon Jelvis 24.04.13
1
@TikhonJelvis Pewnie, ale jeśli / to / else nie potrzebujesz specjalnej funkcji, która zawsze musi zostać podkreślona. Nie potrzebujesz nawet wstępnej przepustki, a mimo to możesz wygenerować porządny kod. Nie cały świat to GHC.
Ingo