Я не читал статью об Эдисоне , но если это не что иное, как реализация чисто функциональных структур данных на Haskell, разве не имеет смысла переносить код SML, который в книге / диссертации? Это должно быть проще, чем портировать код на 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 # заключаются в незначительном синтаксисе, поэтому перевод должен быть легким.
Что касается того, стоит ли это делать, большинство структур данных в книге Окасаки являются очень специализированными, поэтому вряд ли они уже существуют в .NET, даже если F # является неизменным Set и Map. Это будет полезно для людей, которым нужны эти структуры данных.