Создание инфиксных операторов в Scala

Я пытаюсь перевести часть моего кода Haskell в Scala, и мне трудно создавать операторы infix.

В Haskell говорят, что у меня есть этот оператор инфикса, определенный как:

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'

Итак, если у меня есть два логических значения: p и q, где p == True и q == False, p <= > q вернет False.

Мой вопрос в том, как мне перевести это на Scala. Я взглянул на класс Rational, определенный в Odersky Programming, в книге Scala и попытался следовать примеру. Это насколько я понял:

class Iff (b : Boolean){
  def <=> (that : Boolean) : Boolean = {
    this.b == that
  }
}

val a = new Iff(true)
println(a.<=>(false))  // returns false as expected

Я, вероятно, не сделал этого в idiomatic Scala, поэтому я ищу помощь в этом отделе.

Мои вопросы:

  • Я сделал это idiomatically в Scala? Если нет, то что это лучший способ для этого в Scala?
  • Должен ли я создать этот класс для определения этого оператора? Смысл, могу ли я определить автономный метод в Scala, как у меня в коде Haskell выше?
  • Как указать уровень надежности оператора в Scala? То есть, это уровень приоритета.

Ответы

Ответ 1

Вы можете определить implicit class

implicit class Iff(val b: Boolean) extends AnyVal {
  def <=>(that: Boolean) = this.b == that
}

и теперь вы можете вызвать его, не используя new:

true <=> false // false
false <=> true // false
true <=> true  // true