gpt4 book ai didi

scala - Scala 中的一般理解

转载 作者:行者123 更新时间:2023-12-03 18:27:22 24 4
gpt4 key购买 nike

据我了解,Scala for-comprehension 表示法依赖于第一个生成器来定义如何组合元素。即,for (i <- list) yield i返回一个列表和 for (i <- set) yield i返回一个集合。

我想知道是否有一种方法可以指定如何独立于第一个生成器的属性来组合元素。例如,我想获得“给定列表中所有元素的集合”,或“给定集合中所有元素的总和”。我发现的唯一方法是首先按照 for-comprehension 符号的规定构建列表或集合,然后对其应用转换函数 - 在此过程中构建无用的数据结构。

我想到的是一个通用的“代数”理解符号,因为它存在于例如 Ateji PX 中:

`+ { i | int i : set }               // the sum of all elements from a given set
set() { i | int i : list } // the set of all elements from a given list
concat(",") { s | String s : list } // string concatenation with a separator symbol

这里的第一个元素( `+set()concat(",") )是一个所谓的“monoid”,它定义了元素如何组合,独立于第一个生成器的结构(可以有多个生成器和过滤器,我只是试图保持示例简洁)。

关于如何在 Scala 中获得类似结果同时保持简洁的符号有什么想法吗?据我了解,for-comprehension 表示法在编译器中是硬连接的,无法升级。

感谢您的反馈意见。

最佳答案

关于理解
for Scala 中的理解是调用 flatMap 的语法糖, filter , mapforeach .与调用这些方法的方式完全相同,目标集合的类型导致返回集合的类型。那是:

list map f   //is a List
vector map f // is a Vector

此属性是 scala 集合库的基本设计目标之一,在大多数情况下被视为可取的。

回答问题

您当然不需要构建任何中间集合:
(list.view map (_.prop)).toSet //uses list.view

(list.iterator map (_.prop)).toSet //uses iterator

(for { l <- list.view} yield l.prop).toSet //uses view

(Set.empty[Prop] /: coll) { _ + _.prop } //uses foldLeft

将所有生成集合而不生成不必要的集合。我个人的偏好是第一个。就惯用的 scala 集合操作而言,每个“集合”都带有以下方法:
//Conversions
toSeq
toSet
toArray
toList
toIndexedSeq
iterator
toStream

//Strings
mkString

//accumulation
sum

最后一个用于集合的元素类型具有隐式 Numeric 的情况。范围内的实例;如:
Set(1, 2, 3, 4).sum //10
Set('a, 'b).sum //does not compile

请注意,Scala 中的字符串连接示例如下所示:
list.mkString(",")

而在 斯卡拉兹 FP 库可能类似于(使用 Monoid 对字符串求和):
list.intercalate(",").asMA.sum

您的建议看起来不像 Scala;我不确定它们是否受到另一种语言的启发。

关于scala - Scala 中的一般理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6725608/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com