Чому 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.

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


3
Я не думаю, що вкраплення є актуальним питанням. Я розумію, що GHC вже надзвичайно добре поєднує в собі невеликі функції, адже це просто така поширена модель у Haskell.
Тихон Єлвіс

1
@TikhonJelvis Безумовно, але з функцією if / then / else вам не потрібна спеціальна функція, яка завжди повинна бути накресленою. Вам навіть не потрібен вкладений пропуск, і все-таки ви можете генерувати гідний код. Не весь світ - GHC.
Інго
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.