在Scala中创建中缀运算符

时间:2014-05-27 13:16:28

标签: scala haskell

我正在尝试将我的一些Haskell代码转换为Scala,并且我在创建中缀运算符时遇到了困难。

在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&lt; =&gt; q将返回False。

我的问题是如何将其转换为Scala。我看了一下在Odersky的Scala编程书中定义的Rational类 试图效仿这个例子。这是我得到的:

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

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

我可能没有在惯用的Scala中这样做,所以我在那个部门寻求帮助。

我的问题是:

  1. 我是否在Scala中以惯用方式实现了此功能?如果没有,Scala最好的方法是什么?
  2. 我是否必须创建该类才能定义此运算符?意思是,我可以像上面的Haskell代码中那样在Scala中定义一个独立的方法吗?
  3. 如何在Scala中指定运算符的固定级别?也就是说,它是优先级。

1 个答案:

答案 0 :(得分:17)

您可以定义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