Чому 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.
Для семантичного аналізу та генерації коду непогано мати цю конструкцію, яку легко можна скласти до ефективного машинного коду. Зауважте, що код може пропустити ту частину, яка робить обробку для гілки, яка не була досягнута, на відміну від виклику функції, де всі (неоцінені) параметри повинні бути передані. Але це також коштує часу (і пам'яті, яку потрібно повернути пізніше), щоб створити грудку. Щоб виправитись із цього, треба було б вбудувати функцію if скрізь.