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.
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.
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.
Odpowiedzi:
Jest to czysto dla cukru z ładnym
if
,then
ielse
słowa kluczowe; w rzeczywistości GHC (zRebindableSyntax
włączonym rozszerzeniem) usunie składnię, po prostu wywołując dowolnąifThenElse
funkcję w zakresie.źródło
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ć
Więc możesz pisać
zamiast
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.
źródło