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

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

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

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


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


Подводя итоги ответов на сегодняшний день:

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

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

3 ответа

Решение

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

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

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

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

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

Препроцессор затем расширится, если / then / else до if_/then_/else_.

Как насчет:

cond True  t _ = t
cond False _ f = f
Другие вопросы по тегам