gpt4 book ai didi

scala - 为什么隐式转换在列表中不起作用?

转载 作者:行者123 更新时间:2023-12-04 19:33:39 25 4
gpt4 key购买 nike

有人可以快速解释一下为什么在这种情况下隐式转换不起作用吗?谢谢。

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

最佳答案

您的隐式转换将一个String转换为一个Int。在您的第一个示例中,它是由您尝试将字符串放入一个整数列表而触发的。

在第二个示例中,您有一个字符串列表,然后调用方法sum,该方法采用一个隐式Numeric[String]。您的转换不适用,因为您既未尝试将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

它有效,但是结果是一个字符串。

关于scala - 为什么隐式转换在列表中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6729196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com