Почему в Haskell есть встроенная if/then/else
, зависящая от Bool
типа, а не простая библиотечная функция? Такие как
if :: Bool -> a -> a -> a
if True x _ = x
if False _ y = y
Почему в Haskell есть встроенная if/then/else
, зависящая от Bool
типа, а не простая библиотечная функция? Такие как
if :: Bool -> a -> a -> a
if True x _ = x
if False _ y = y
Ответы:
Это чисто для хорошего сахара if
, then
и else
ключевых слов; на самом деле, GHC (с RebindableSyntax
включенным расширением) будет десагаровать синтаксис, просто вызывая любую ifThenElse
функцию в области видимости.
Это не имеет большого значения ... для меня это выглядит так, как если бы / то / иное не использовалось очень часто в наше время. Я нахожу себя пишущим охранников, если ... тогда ... еще.
С синтаксической точки зрения, однако, приятно иметь
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.