加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用Scala折叠元组列表

发布时间:2020-12-16 18:32:59 所属栏目:安全 来源:网络整理
导读:这个简单的 scala代码有什么问题? val l = List(("a",1),("b",2),("c",3),("d",4),("e",5))l.fold(0) {(acc: Int,tup: (String,Int)) = acc + tup._2} :9: error: type mismatch; found : (Int,(String,Int)) = Int required: (Any,Any) = Any l.fold(0) {(
这个简单的 scala代码有什么问题?

val l = List(("a",1),("b",2),("c",3),("d",4),("e",5))
l.fold(0) {(acc: Int,tup: (String,Int)) => acc + tup._2}

:9: error: type mismatch;
found : (Int,(String,Int)) => Int
required: (Any,Any) => Any
l.fold(0) {(acc: Int,Int)) => acc + tup._2}

在其他功能语言(例如,f#)中,这有效:

let l = [("a",1); ("b",2); ("c",3); ("d",4)];;
List.fold(fun accm tup -> accm + (snd tup)) 0 l;;
val it : int = 10

解决方法

fold方法假设一个关联运算符,并且理论上(例如,当使用并行性时)可以以任意顺序执行.签名因此清楚地表明累积类型必须是集合元素的超类型:

def fold[A1 >: A](z: A1)(op: (A1,A1) ? A1): A1

推断的超类型(String,Int)和Int是Any.

这一切都在API documentation中描述.

你想要的是foldLeft或foldRight,它对类型没有这个限制:

def foldLeft[B](z: B)(f: (B,A) ? B): B

因此:

l.foldLeft(0) { (acc,tup) =>
  acc + tup._2 
}

要么

(0 /: l) { 
  case (acc,(_,n)) => acc + n 
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读