首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Scala中对对列表调用.map()

如何在Scala中对对列表调用.map()
EN

Stack Overflow用户
提问于 2012-10-16 19:53:20
回答 4查看 26.1K关注 0票数 27

我想对一组对调用map(),但是我得到了一个类型不匹配错误。

例如,假设我想将Int对的列表映射到它们的和的列表:

代码语言:javascript
复制
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()时,我得到了一个非常类似的错误:

代码语言:javascript
复制
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))
                                  ^

?标志代表什么?这里我漏掉了什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-16 19:56:42

您可以使用pattern matching来获取元素对的元素。

代码语言:javascript
复制
ll.map{ case (x:Int,y:Int) => x + y }

您甚至不需要指定类型:

代码语言:javascript
复制
ll.map{ case (x, y) => x + y }

当然,这也适用于foreach

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

票数 47
EN

Stack Overflow用户

发布于 2012-10-16 19:56:33

您可以使用:

代码语言:javascript
复制
ll.map(x => x._1 + x._2)

其中x代表元组本身,或者

代码语言:javascript
复制
ll.map(x:(Int,Int) => x._1 + x._2)

如果要显式声明类型,请执行以下操作。

票数 20
EN

Stack Overflow用户

发布于 2012-10-16 23:45:19

你可以对一个函数进行元组,这意味着从一个包含N个参数的函数变成一个包含1个参数的函数,这是一个N元组。执行此操作的高阶函数在Function对象上可用。这导致了很好的语法,以及Brian Agnew答案的注释中突出显示的额外类型安全性。

代码语言:javascript
复制
import Function.tupled

ll map tupled(_ + _)
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12914121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档