Could someone give a quick explanation why implicit conversion doesn’t work in these cases? Thanks.
scala> implicit def strTwoInt (s: String):Int = s.toCharArray.map{_.asDigit}.sum
strTwoInt: (s: String)Int
scala> List[Int]("1","2","3") sum
res3: Int = 6
scala> List("1","2","3") sum
<console>:9: error: could not find implicit value for parameter num: Numeric[java.lang.String]
List("1","2","3") sum
scala> val a = List("1","2","3")
scala> a.foldLeft(0)((i:Int, j:Int) => i+j)
<console>:10: error: type mismatch;
found : (Int, Int) => Int
required: (Int, java.lang.String) => Int
Your implicit conversion converts a String in an Int. In your first example, it is triggered by the fact that you try to put Strings into a List of Ints.
In your second example, you have a List of String and you call the method sum, which takes an implicit
Numeric[String]. Your conversion does not apply because you neither try to pass a String somewhere the compiler was expecting an Int, nor you tried to call a method which is defined in Int and not in String. In that case, you can either define aNumeric[String]which use explicitly your conversion, or use a method which takes aList[Int]as parameter (giving hint to the compiler):In the third example, the foldLeft second argument must be of type:
the one you actually passed is of type:
however, you did not define any implicit conversion between these two types. But:
triggers your conversion and works.
Edit: Here’s how to implement the
Numeric[String]:It works, but the result is a String.