[英]Providing implicit conversion functions as parameters in Scala
我正在使用Horstmann撰写的“ Scala for不耐烦”一书来学习scala。
作者建议练习定义一个分数=> Ordered [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个小数参数调用时,较小的函数将引发错误。
错误是
Type mismatch, expected:(Fraction) => Ordered[Fraction], actual:(Fraction,Fraction) => Ordered.
我对创建一个将单个小数作为参数并将其转换为Ordered [Fraction]的函数感到震惊。
任何人都可以通过以下两种方式帮助我实现相同的功能。
定义一个函数Fraction => Ordered [Fraction]并将其提供给调用
使它可用作隐式 val。
提前致谢。
我相信您想要的是这样的:
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))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.