在Scala中提供隐式转换函数作为参数

时间:2016-01-12 14:48:11

标签: scala

我正在使用horstmann的书“Scala for impatient”来学习scala。

作者建议练习定义一个函数Fraction =>有序[分数]并在调用中提供它或使其可用作隐式 val。

这是我在Scala工作表中实现的完整代码。

    case class Fraction (n:Int,d:Int) {
        def *(that: Fraction):Fraction = new Fraction(n * that.n , d * that.d)
  }

 def smaller[T](a:T,b:T)(implicit order:T => Ordered[T]) = {
   if(a<b) a else b
 }

 implicit def compareFraction(a:Fraction,b:Fraction) ={
    if(a.n  * b.d > a.d * b.n)  a else b
  }

 smaller(Fraction(4,5),Fraction(4,6)) (compareFraction)

较小的函数在使用2个Fraction参数调用时抛出错误。

错误是

   Type mismatch, expected:(Fraction) => Ordered[Fraction], actual:(Fraction,Fraction) => Ordered.

我很擅长创建一个函数,它将单个Fraction作为参数并将其转换为Ordered [Fraction]。

任何人都可以通过以下两种方式帮助我实现相同的目标。

  1. 定义函数Fraction =&gt;订购[分数]并在通话中提供

  2. 将其设为隐式 val。

  3. 提前致谢。

1 个答案:

答案 0 :(得分:0)

我相信你想要的是这样的:

case class Fraction (n:Int,d:Int) {
  def *(that: Fraction):Fraction = new Fraction(n * that.n , d * that.d)
}

def smaller[T](a:T,b:T)(implicit order:T => Ordered[T]) = {
  if(a<b) a else b
}

implicit def fractionToOrdered(fraction: Fraction):Ordered[Fraction] = new Ordered[Fraction] {
  override def compare(that: Fraction): Int = ???
}

smaller[Fraction](Fraction(4,5),Fraction(4,6))