[英]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.