Por que o Haskell possui um built-in if/then/else
, que depende do Bool
tipo, 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
Por que o Haskell possui um built-in if/then/else
, que depende do Bool
tipo, 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
Respostas:
É puramente para o açúcar agradável da if
, then
e else
palavras-chave; de fato, o GHC (com a RebindableSyntax
extensão ativada) alterará a sintaxe simplesmente chamando qualquer ifThenElse
função que esteja no escopo.
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.