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:
For a long time, Scala has supported a useful “trick” called infix operator notation. If a method takes a single argument, you can call it without the period after the instance and without parentheses around the argument.
The ::() operator in Scala is utilized to add an element to the beginning of the List. Method Definition: def ::(x: A): List[A] Return Type: It returns the stated list after adding an element to the beginning of it.
Infix notation is the notation commonly used in arithmetical and logical formulae and statements. It is characterized by the placement of operators between operands—"infixed operators"—such as the plus sign in 2 + 2.
Operator Overloading in Scala Scala supports operator overloading, which means that the meaning of operators (such as * and + ) may be defined for arbitrary types. Example: a complex number class: class Complex(val real : Double, val imag : Double) { def +(other : Complex) = new Complex( real + other.
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
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