Edison API 和核心模块是纯功能数据结构的 Haskell 实现
F# 和原生 .Net 数据结构是否充分涵盖了 Edison API 和 Core 中的用例?
尝试将 API 和 CORE Haskell 模块移植到 F# 会有什么好处吗?
Edison API 和核心模块是纯功能数据结构的 Haskell 实现
F# 和原生 .Net 数据结构是否充分涵盖了 Edison API 和 Core 中的用例?
尝试将 API 和 CORE Haskell 模块移植到 F# 会有什么好处吗?
我没有读过关于 edison 的论文,但如果它只不过是纯功能数据结构的 Haskell 实现,那么移植书中/论文中的 SML 代码不是更有意义吗?它应该比移植 Haskell 代码更容易,Haskell 代码必须为严格注解,而 F# 必须为懒惰而注解。
本书使用的语言是 SML,带有用于惰性求值的语法扩展。F# 原生提供了这些扩展的一半:
> let x = lazy 12;;
val x : Lazy<int> = <unevaluated>
> match x with
| Lazy(n) -> n;;
val it : int = 12
> x;;
val it : Lazy<int> = 12
要转换本书的fun lazy
符号,请更改:
fun lazy plus ($m, $n) = $m + n
对此:
let plus (m',n') = lazy (
match (m',n') with
| (Lazy(m), Lazy(n)) -> (lazy (m + n)).Force())
(见本书第 33 页)。SML 和 F# 之间的区别只是语法上的细微差别,因此翻译应该很容易。
至于值不值得,Okasaki 书中的大部分数据结构都是非常专业的,因此它们不太可能已经存在于 .NET 中,即使是 F# 的不可变 Set 和 Map。对于需要这些数据结构的人来说,这将是值得的。
几个月后重新审视这个问题,我注意到
http://lepensemoi.free.fr/index.php/tag/purely-functional-data-structures
有人在那个博客上实现了很多。
我没有点击链接,尽管我至少对作品或冈崎有一点熟悉。因此,整个答案都是推测性的(我对 Edison API 中的内容的假设可能不正确)。
我希望在人们喜欢“新语言”中的“通用 FP 数据结构的参考实现”以帮助学习新语言的意义上说会有“一些好处”。
至于在实践中的使用(而不是教学法),我希望其中一些是有用的,尽管有一些 F# 和 .Net API 对于许多场景可能同样有用或更有用。我猜主要的“批次”重叠功能是 F# 不可变集合(Set 和 Map),以及 .Net 4.0并发集合(如 ConcurrentQueue)。
当然,您还会在网络上找到一些片段,例如 Jomo 的不可变队列。