Scala的瞬态集合?
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#库). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |