Ваше неявное преобразование преобразует строку в Int. В вашем первом примере это вызвано тем, что вы пытаетесь поместить строки в список Ints.
Во втором примере у вас есть список строк и вы вызываете метод sum, который принимает неявное значение Numeric[String]
. Ваше преобразование не применяется, потому что вы не пытаетесь передать строку в то место, где компилятор ожидал Int, или вы пытались вызвать метод, который определен в Int, а не в String. В этом случае вы можете либо определить Numeric[String]
, который использует явно ваше преобразование, либо использовать метод, который принимает List[Int]
в качестве параметра (давая подсказку компилятору):
scala> def sumIt( xs: List[Int] ) = xs sum
sumIt: (xs: List[Int])Int
scala> sumIt( List("1","2","3") )
res5: Int = 6
В третьем примере второй аргумент foldLeft должен иметь тип:
(Int,String) => Int
тот, который вы на самом деле передали, имеет тип:
(Int,Int) => Int
однако вы не определили никакого неявного преобразования между этими двумя типами. Но:
a.foldLeft(0)((i:Int, j:String) => i+j)
запускает ваше преобразование и работает.
Редактировать: Вот как реализовать Numeric[String]
:
implicit object StringNumeric extends math.Numeric[String] {
val num = math.Numeric.IntIsIntegral
def plus(x: String, y: String) = num.plus(x,y).toString
def minus(x: String, y: String) = num.minus(x,y).toString
def times(x: String, y: String) = num.times(x,y).toString
def negate(x: String): String = num.negate(x).toString
def fromInt(x: Int) = x.toString
def toInt(x: String) = x
def toLong(x: String) = toInt(x)
def toFloat(x: String) = toInt(x)
def toDouble(x: String) = toInt(x)
def compare(x:String,y:String) = num.compare(x,y)
}
scala> List("1","2","3") sum
res1: java.lang.String = 6
Это работает, но в результате получается строка.