haskell ghc leksah

¿Cómo podría eliminar las palabras clave "si... entonces... más..." en Haskell(GHC)?



leksah (3)

Me gustaría eliminar las palabras clave if ... then ... else ... , porque estoy incrustando un idioma / DSL en Haskell. if , then y mucho else transmita un gran significado en muchos dominios, y sería genial si pudiera redefinirlos (o dejarlos sin definir) para reflejar la naturaleza del idioma / dominio.

He buscado en Google y stackoverflow, pero no encontré nada. (Encontré un hilo antiguo sobre por qué if ... then ... else ... se incluyó como palabras clave en Haskell).

Mi IDE está en Leksah y, si las palabras clave se pueden eliminar, también sería bueno tener una configuración para cambiar las palabras clave if ... then ... else ... nuevo a su fuente / color / unbold normal.

Ya he intentado una convención de nomenclatura de if'' for if y así sucesivamente. No se siente tan bien, especialmente cuando quiero definir if y if'' , y tengo que definir if'' and if'''' lugar, o if1 and if2 . La presencia de ambos if'' y if también podría ser confuso. (La confusión no es un problema tan serio en mi situación ya que los usuarios de DSL son programadores de Haskell, pero supongo que puede ayudar en otras situaciones).

Resumiendo las respuestas hasta la fecha:

  • Use la extensión RebindableSyntax para GHC. No es tan general como eliminar las palabras clave: se conserva la sintaxis de Haskell if-then-else. (Frerich Raabe)
  • Solución alternativa: utilice palabras / nombres muy similares, utilizando data Conditional ba = If b (Then a) (Else a) (solo aplicable en algunos contextos). (CA McCann)

Si RebindableSyntax es una característica relativamente nueva, es poco probable que encuentre una forma más general, al menos no hasta la próxima versión de GHC.


La extensión RebindableSyntax a GHC le permite sobrecargar if ... then ... else expresiones con su propia versión. En particular, la función ifThenElse se utiliza para definir significados alternativos. if e1 then e2 else e3" significa ifThenElse e1 e2 e3 .

Consulte el artículo del blog Rebindable if..then..else expresiones para una discusión agradable de esta característica, incluidos algunos ejemplos.


No puedes eliminar las palabras clave existentes. Como se señaló, puede usar RebindableSyntax, pero eso podría no hacer lo que quiere.

Lo único que se acerca a la eliminación de palabras clave es activar la opción CPP y hacer algo como

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

El preprocesador luego expandirá if / then / else a if_ / then_ / else_.


Qué tal si:

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