Почему в Haskell встроено «if / then / else» вместо определения его как простой библиотечной функции?

25

Почему в Haskell есть встроенная if/then/else, зависящая от Boolтипа, а не простая библиотечная функция? Такие как

if :: Bool -> a -> a -> a
if True  x _ = x
if False _ y = y
Петр Пудлак
источник
4
Я предполагаю, что им явно нужен синтаксис if / then / else, который они не могут получить без функций mixfix, как в agda. Функция, на которую вы ссылаетесь, структурирована как троичная, которую вы могли бы реализовать самостоятельно, хотя я полагаю, что они дали нам сахар if / then / else (скорее всего, это просто сахар над случаем) только потому, что они могли, и это безвредно .. Но у меня ничего нет чтобы поддержать меня здесь, поэтому я пишу это в комментарии.
Джимми Хоффа
10
Это может быть очевидным для большинства читателей, но я хотел бы отметить, что наличие функции f / then / else не было бы хорошим решением в нетерпеливом языке (например, схема или sml), хотя это разумно в ленивом язык, как Haskell.
Джорджио

Ответы:

24

Это чисто для хорошего сахара if, thenи elseключевых слов; на самом деле, GHC (с RebindableSyntaxвключенным расширением) будет десагаровать синтаксис, просто вызывая любую ifThenElseфункцию в области видимости.

Пламя Птариена
источник
6

Это не имеет большого значения ... для меня это выглядит так, как если бы / то / иное не использовалось очень часто в наше время. Я нахожу себя пишущим охранников, если ... тогда ... еще.

С синтаксической точки зрения, однако, приятно иметь

if expr1 then expr2 else expr3

Так что вы можете написать

if foo a then bar b else baz c

вместо того

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

который выглядит слишком LISPish для меня.

Для семантического анализа и генерации кода хорошо иметь такую ​​конструкцию, которую можно легко скомпилировать в эффективный машинный код. Обратите внимание, что код может пропустить часть, которая создает thunk для ветви, которая не достигнута, в отличие от вызова функции, где все (неоцененные) параметры должны быть переданы. Но это также требует времени (и памяти, которая должна быть восстановлена ​​позже), чтобы создать Thunk. Чтобы справиться с этим, нужно было бы везде встроить функцию if.

Инго
источник
3
Я не думаю, что встраивание является актуальной проблемой. Насколько я понимаю, GHC уже очень хорошо умеет вкладывать небольшие функции, потому что это просто такая распространенная модель в Haskell.
Тихон Джелвис
1
@TikhonJelvis Конечно, но с if / then / else вам не нужна специальная функция, которая всегда должна быть встроенной. Вам даже не нужен проход для вставки, и все же вы можете генерировать приличный код. Не весь мир - это GHC.
Инго