Creating infix operators in Scala

2020-02-28 02:58发布

问题:

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:

  1. Have I implemented this idiomatically in Scala? If not, what is that best way to this in Scala?
  2. 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?
  3. How to specify the fixity level of the operator in Scala? That is, it's precedence level.

回答1:

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


标签: scala haskell