
On 7/27/06, David House
How about we drop the idea of an auxilary cond function, and instead just use a Boolean typeclass?
class Boolean b where isTrue :: b -> Bool isFalse :: b -> Bool
Then the semantics of if-then-else would change to something like this:
if b then t1 else t2 b is required to be of a type which instantiates Boolean If isTrue b is True, then t1 is executed, otherwise if isFalse b is True, then t2 is executed, otherwise _|_ is returned.
Then you get the benefit of being able to use arbitrary 'boolean-like' types in actual if statements, without messing around with -fno-implicit-prelude and rebindable syntax.
It would be possible, sure, but I don't want to go in this direction. I don't only want to overload the if-then-else for different kinds of booleans, I would like to be able to change its behavior completely. One particular application of this that I have in mind is the JavaScript "embedding" that Joel Björnson is currently working on as his SoC project. There the "embedding" is actually a set of combinators for constructing an abstract syntax tree, so if-then-else would translate into the data constructor IfThenElse applied to its arguments. /Niklas