Reputation:
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:
Upvotes: 15
Views: 3398
Reputation: 1265
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
Upvotes: 17