Creating infix operators in Scala
haskell, scala
Solution
You can define `implicit class`
implicit class Iff(val b: Boolean) extends AnyVal {
def <=>(that: Boolean) = this.b == that
}
and now you can call it without using `new` :
true <=> false // false
false <=> true // false
true <=> true // true
Problem
I am trying to translate some of my Haskell code into Scala and I am having difficulty with creating infix operators. In Haskell say I have this infix operator defined as: ``` infix 1 <=> // this specifies the operator precedence (<=>) :: Bool -> Bool -> Bool // this is the type signature of this operator (it says, it takes two Boolean values and returns a Boolean value) x <=> y = x == y // this is the definition of the operator, it is mimicking the behaviour of the logical implication 'if-and-only-if' ``` So now if I have two booleans, p and q where p == True and q == False, p <=> q will return False. My question is how do I go about translating this into Scala. I had a look at the Rational class defined in Odersky's Programming in Scala book and tried to follow the example. This is as far as I got: ``` class Iff (b : Boolean){ def <=> (that : Boolean) : Boolean = { this.b == that } } val a = new Iff(true) println(a.<=>(false)) // returns false as expected ``` I've probably not done this in idiomatic Scala so I am looking for help in that department. My questions are: - Have I implemented this idiomatically in Scala? If not, what is that best way to this in Scala? - Did I have to create that class in order to define this operator? Meaning, can I define a standalone method in Scala like I have in the Haskell code above? - How to specify the fixity level of the operator in Scala? That is, it's precedence level.