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

Scala的瞬态集合?

发布时间:2020-12-16 18:13:58 所属栏目:安全 来源:网络整理
导读:Clojure有一个非常好的概念 transient collections.是否有一个为Scala(或F#)提供的库? 解决方法 对于像F#这样的语言来说,这听起来真的很棒,感谢有趣的链接! 使用数组编程时,F#程序员使用完全相同的模式.例如,创建一个可变数组,命令性地初始化它,返回它然后
Clojure有一个非常好的概念 transient collections.是否有一个为Scala(或F#)提供的库?

解决方法

对于像F#这样的语言来说,这听起来真的很棒,感谢有趣的链接!

使用数组编程时,F#程序员使用完全相同的模式.例如,创建一个可变数组,命令性地初始化它,返回它然后使用将其视为不可变的函数(如Array.map)来处理它(即使数组实际上可以变异,因为没有瞬态数组).

使用seq<'a>类型:执行类似操作的一种方法是将数据结构转换为通用序列(seq< a>),这是一种不可变数据类型,因此您不能(直接)通过seq<'a>修改原始数据结构.例如:

let test () = 
  let arr = Array.create 10 0
  for i in 0 .. (arr.Length - 1) do
    arr.[i] <- // some calculation
  Array.toSeq arr

好处是转换通常是O(1)(数组/列表/ ..实现seq<'a>作为接口,所以这只是转换).但是,seq< a>不保留源集合的属性(例如效率等),您只能使用通用函数来处理它(用于处理序列)(来自Seq模块).但是,我认为这与瞬态收集模式相对接近.

类似的.NET类型也是ReadOnlyCollection<'a>它将一个集合类型(比seq<'a>更强大)包装到一个不可变的包装器中,该包装器的操作用于修改集合抛出异常.

相关类型:对于更复杂的集合类型,F#/ .NET通常具有可变和不可变的实现(不可变的实现来自F#库).类型通常是完全不同的,但有时共享一个共同的接口.这使得在使用突变时可以使用一种类型,并在您知道不再需要它时将其转换为另一种类型.但是,这里需要在不同结构之间复制数据,因此转换肯定不是O(1).它可能是O(n)和O(n * log n)之间的东西.

类似集合的示例是可变字典<'Key,'Value>使用不可变的Map<'Key,'Value>和可变的HashSet<'T>或者SortedSet<'T>使用不可变集合<'T> (来自F#库).

(编辑:李大同)

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

    推荐文章
      热点阅读