我想调用map()一对对列表,但我得到一个类型不匹配错误.
例如,假设我想将Int对的列表映射到它们的总和列表:
scala> val ll=List((1,2),(3,4),(5,6))
ll: List[(Int, Int)] = List((1,2), (3,4), (5,6))
scala> ll.map((x:Int,y:Int)=>x+y)
<console>:9: error: type mismatch;
found : (Int, Int) => Int
required: ((Int, Int)) => ?
ll.map((x:Int,y:Int)=>x+y)
^
Run Code Online (Sandbox Code Playgroud)
顺便说一句,当试图运行foreach()时,我得到一个非常类似的错误.
scala> ll.foreach((x:Int,y:Int)=>println(x,y))
<console>:9: error: type mismatch;
found : (Int, Int) => Unit
required: ((Int, Int)) => ?
ll.foreach((x:Int,y:Int)=>println(x,y))
^
Run Code Online (Sandbox Code Playgroud)
那是什么?标志代表什么?我在这里错过了什么?
谢谢
Kim*_*bel 45
您可以使用模式匹配来获取对的元素.
ll.map{ case (x:Int,y:Int) => x + y }
Run Code Online (Sandbox Code Playgroud)
您甚至不需要指定类型:
ll.map{ case (x, y) => x + y }
Run Code Online (Sandbox Code Playgroud)
同样的作品有foreach当然的.
错误消息告诉您编译器期望找到任何类型(问号)的一个参数(一对int)的函数,而是找到两个参数的函数,两个int.
Bri*_*new 20
您可以使用:
ll.map(x => x._1 + x._2)
Run Code Online (Sandbox Code Playgroud)
where x代表元组本身,或者
ll.map(x:(Int,Int) => x._1 + x._2)
Run Code Online (Sandbox Code Playgroud)
如果要显式声明类型.
你可以编组一个函数,这意味着从一个带有N个args的函数转换为一个带有1个ar 元组的函数,它是一个N元组.可以在Function对象上使用执行此操作的高阶函数.这导致了很好的语法加上Brian Agnew的回答中突出显示的额外类型安全性.
import Function.tupled
ll map tupled(_ + _)
Run Code Online (Sandbox Code Playgroud)