I would like to remove the if ... then ... else ...
keywords, because I am embedding a language/DSL in Haskell. if
, then
and else
convey a lot of meaning in many domains, and it would be great if I could redefine (or leave them undefined) them to reflect the nature of the language/domain.
I've searched on Google and stackoverflow, but found nothing. (I did find an old thread on why if ... then ... else ...
was included as keywords in Haskell.)
My IDE is in Leksah, and, if the keywords can be removed, it would also be nice to have a setting to change the if ... then ... else ...
keywords back to their normal font/color/unbold.
I've already tried a naming convention of if'
for if
and so on. It doesn't feel as good, especially when I want to define if
and if'
, and have to define if'
and if''
instead, or if1
and if2
. The presence of both if'
and if
might also be confusing. (The confusion is not that serious an issue in my situation as the users of the DSL are Haskell programmers, but I suppose it can help in other situations).
Summarizing the responses to date:
RebindableSyntax
extension to GHC. Not as general as removing the keywords: the syntax of Haskell's if-then-else is retained. (Frerich Raabe)data Conditional b a = If b (Then a) (Else a)
(only applicable in some contexts). (C. A. McCann)If RebindableSyntax
is a relatively new feature, then it's unlikely to find a more general way, at least not till the next version of GHC.
Note that in Haskell if is an expression (which is converted to a value) and not a statement (which is executed) as in many imperative languages. As a consequence, the else is mandatory in Haskell. Since if is an expression, it must evaluate to a result whether the condition is true or false, and the else ensures this.
in goes along with let to name one or more local expressions in a pure function.
return is actually just a simple function in Haskell. It does not return something. It wraps a value into a monad.
The RebindableSyntax extension to GHC lets you overload if ... then ... else
expressions with your own version. In particular, the ifThenElse
function is used to define alternative meanings. if e1 then e2 else e3"
means ifThenElse e1 e2 e3
.
See the blog article Rebindable if..then..else expressions for a nice discussion of this feature, including some examples.
You can't remove existing keywords. As was pointed out you can use RebindableSyntax, but that might not do what you want.
The only thing getting close to removing keywords is to turn on the CPP option and doing something like
#define if if_
#define then then_
#define else else_
The preprocessor will then expand if/then/else to if_/then_/else_.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With