Por que Haskell possui "if / then / else" embutido em vez de defini-lo como uma função simples de biblioteca?

25

Por que o Haskell possui um built-in if/then/else, que depende do Booltipo, em vez de ter uma função simples de biblioteca? Tal como

if :: Bool -> a -> a -> a
if True  x _ = x
if False _ y = y
Petr Pudlák
fonte
4
Eu acho que eles queriam explicitamente a sintaxe if / then / else que eles não podem obter sem as funções mixfix como no agda. A função a que você se refere é estruturada como ternária, que você pode implementar a si mesmo, embora eu presuma que eles nos deram açúcar if / then / else (provavelmente é apenas açúcar em um caso) só porque eles poderiam e é inofensivo. Mas eu não tenho nada para me apoiar aqui, e é por isso que estou escrevendo isso em um comentário.
Jimmy Hoffa
10
Isso pode ser óbvio para a maioria dos leitores, mas eu gostaria de salientar que ter îf / then / else como uma função não seria uma boa solução em um idioma ansioso (por exemplo, schema ou sml) enquanto for razoável em um ambiente preguiçoso linguagem como Haskell.
Giorgio

Respostas:

24

É puramente para o açúcar agradável da if, thene elsepalavras-chave; de fato, o GHC (com a RebindableSyntaxextensão ativada) alterará a sintaxe simplesmente chamando qualquer ifThenElsefunção que esteja no escopo.

Chama de Ptharien
fonte
6

Não importa muito ... para mim, parece que se / então / outro não é usado com muita frequência hoje em dia. Eu me pego escrevendo guardas de padrões instad de se ... então ... mais.

Do ponto de vista sintático, porém, é bom ter

if expr1 then expr2 else expr3

Então você pode escrever

if foo a then bar b else baz c

ao invés de

if (foo a) (bar b) (baz c)

o que parece um pouco demais para mim.

Para análise semântica e geração de código, é bom ter essa construção, que pode ser facilmente compilada em código de máquina eficiente. Observe que o código pode ignorar a parte que faz a conversão para a ramificação que não é alcançada, em oposição a uma chamada de função, na qual todos os parâmetros (não avaliados) devem ser passados. Mas também custa tempo (e memória, que deve ser recuperado posteriormente) para criar a conversão. Para resolver isso, seria necessário alinhar a função if em qualquer lugar.

Ingo
fonte
3
Não acho que o inlining seja um problema real. Meu entendimento é que o GHC já é excepcionalmente bom em embutir pequenas funções, porque é apenas um padrão tão comum em Haskell.
Tikhon Jelvis
1
@TikhonJelvis Claro, mas com if / then / else você não precisa de uma função especial que sempre deve ser incorporada. Você nem precisa de um passe embutido e ainda pode gerar um código decente. Nem todo o mundo é GHC.
Ingo