3

Edison API 和核心模块是纯功能数据结构的 Haskell 实现

F# 和原生 .Net 数据结构是否充分涵盖了 Edison API 和 Core 中的用例?

尝试将 API 和 CORE Haskell 模块移植到 F# 会有什么好处吗?

4

3 回答 3

7

我没有读过关于 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。对于需要这些数据结构的人来说,这将是值得的。

于 2009-10-21T21:06:11.350 回答
5

几个月后重新审视这个问题,我注意到

http://lepensemoi.free.fr/index.php/tag/purely-functional-data-structures

有人在那个博客上实现了很多。

于 2010-02-25T16:38:28.970 回答
4

我没有点击链接,尽管我至少对作品或冈崎有一点熟悉。因此,整个答案都是推测性的(我对 Edison API 中的内容的假设可能不正确)。

我希望在人们喜欢“新语言”中的“通用 FP 数据结构的参考实现”以帮助学习新语言的意义上说会有“一些好处”。

至于在实践中的使用(而不是教学法),我希望其中一些是有用的,尽管有一些 F# 和 .Net API 对于许多场景可能同样有用或更有用。我猜主要的“批次”重叠功能是 F# 不可变集合(Set 和 Map),以及 .Net 4.0并发集合(如 ConcurrentQueue)。

当然,您还会在网络上找到一些片段,例如 Jomo 的不可变队列

于 2009-10-21T19:14:17.357 回答