27

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

顺便说一句,当尝试运行 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))
                                  ^

?标志代表什么?我在这里想念什么?

4

4 回答 4

47

您可以使用模式匹配来获取该对的元素。

ll.map{ case (x:Int,y:Int) => x + y }

您甚至不需要指定类型:

ll.map{ case (x, y) => x + y }

当然,同样适用foreach

错误消息告诉您,编译器希望找到任何类型(问号)的一个参数(一对整数)的函数,而是找到了两个参数的函数,都是整数。

于 2012-10-16T11:56:42.210 回答
20

您可以使用:

ll.map(x => x._1 + x._2)

wherex代表元组本身,或

ll.map(x:(Int,Int) => x._1 + x._2)

如果要显式声明类型。

于 2012-10-16T11:56:33.333 回答
7

您可以对一个函数进行元组化,这意味着从一个需要 N 个 args 的函数变为一个需要 1 个 arg 的 N 元组。执行此操作的高阶函数在Function对象上可用。这会产生很好的语法以及在对 Brian Agnew 的回答的评论中突出显示的额外类型安全性。

import Function.tupled

ll map tupled(_ + _)
于 2012-10-16T15:45:18.850 回答
1

从 开始Scala 3参数 untupling得到了扩展,允许使用这样的语法:

List((1, 2), (3, 4), (5, 6)).map(_ + _)
// List(3, 7, 11)

其中 each_指的是关联的元组部分。

于 2019-05-21T20:35:59.990 回答