如何在scala中的对列表上调用.map()?

aki*_*iva 27 scala

我想调用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)

如果要显式声明类型.

  • 我认为性治疗不会解决我的类型推理问题 (3认同)
  • 虽然是真的; 我认为这是不好的风格; 我们应该始终使用`case(x,y)` (2认同)
  • 那你很幸运; 它不在那张专辑上:-) (2认同)

Lui*_*hys 7

你可以编组一个函数,这意味着从一个带有N个args的函数转换为一个带有1个ar 元组的函数,它是一个N元组.可以在Function对象上使用执行此操作的高阶函数.这导致了很好的语法加上Brian Agnew的回答中突出显示的额外类型安全性.

import Function.tupled

ll map tupled(_ + _)
Run Code Online (Sandbox Code Playgroud)