Как я могу удалить ключевые слова "if... then... else..." в Haskell (GHC)?

Я хотел бы удалить ключевые слова if ... then ... else ..., потому что я встраиваю язык /DSL в Haskell. if, then и else передают много смысла во многих доменах, и было бы замечательно, если бы я мог переопределить (или оставить их undefined) для отражения природы языка/домена.

Я искал в Google и stackoverflow, но ничего не нашел. (Я нашел старый поток о том, почему if ... then ... else ... был включен как ключевые слова в Haskell.)

Моя IDE находится в Leksah, и, если ключевые слова могут быть удалены, было бы неплохо иметь параметр, чтобы изменить ключевые слова if ... then ... else ... на их обычный шрифт/цвет/разворот.


Я уже пробовал соглашение об именах if' для if и так далее. Это не так хорошо, особенно когда я хочу определить if и if', и вместо этого нужно определить if' и if'' или if1 и if2. Присутствие как if', так и if также может вводить в заблуждение. (Смешение не является серьезной проблемой в моей ситуации, поскольку пользователи DSL являются программистами Haskell, но я полагаю, что это может помочь в других ситуациях).


Подведение итогов ответов:

  • Используйте расширение RebindableSyntax для GHC. Не так, как обычно, как удаление ключевых слов: синтаксис Haskell if-then-else сохраняется. (Фририк Раабе)
  • Временное решение: используйте очень похожие слова/имена, используя data Conditional b a = If b (Then a) (Else a) (применимо только в некоторых контекстах). (C. A. McCann)

Если RebindableSyntax - относительно новая функция, то вряд ли можно найти более общий способ, по крайней мере, не до следующей версии GHC.

Ответы

Ответ 1

Расширение RebindableSyntax для GHC позволяет вам перегружать выражения if ... then ... else своей собственной версией. В частности, функция ifThenElse используется для определения альтернативных значений. if e1 then e2 else e3" означает ifThenElse e1 e2 e3.

См. статью в блоге Повторно отмените if.. then..else выражения для приятного обсуждения этой функции, включая некоторые примеры.

Ответ 2

Вы не можете удалить существующие ключевые слова. Как было указано, вы можете использовать RebindableSyntax, но это может не делать то, что вы хотите.

Единственное, что подходит для удаления ключевых слов, - включить параметр CPP и сделать что-то вроде

#define if if_
#define then then_
#define else else_

Препроцессор будет затем расширяться, если /then/else - if_/then_/else _.

Ответ 3

Как насчет:

cond True  t _ = t
cond False _ f = f