Есть ли какая-то польза от переноса API Haskell Edison и Core на F#?
Модули Edison API и Core являются реализацией чисто функциональных структур данных на Haskell.
Достаточно ли охватывают структуры данных F# и нативные.Net варианты использования в Edison API и Core?
Будет ли какая-то польза от попыток перенести модули API и CORE Haskell на F#?
3 ответа
Я не читал статью об Эдисоне, но если это не что иное, как реализация чисто функциональных структур данных на 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. Это будет полезно для людей, которым нужны эти структуры данных.
Возвращаясь к этому вопросу несколько месяцев спустя, отмечу, что
http://lepensemoi.free.fr/index.php/tag/purely-functional-data-structures
кто-то реализовал их в этом блоге.
Я не перешел по ссылке, хотя у меня есть хотя бы крошечная фамилия с работой или Окасаки. Так что весь этот ответ дико спекулятивен (я могу быть не прав в своих предположениях о том, что в Edison API).
Я ожидаю, что есть "некоторая выгода" в том смысле, что люди любят "ссылочные реализации общих структур данных FP" в "новых языках", чтобы помочь в изучении новых языков.
Что касается практического использования (а не педагогики), я ожидаю, что некоторые из них полезны, хотя есть некоторые API F# и.Net, которые могут быть как полезными, так и более полезными для многих сценариев. Я полагаю, что основными "пакетами" перекрывающихся функций являются неизменяемые коллекции F# (Set и Map), а также параллельные коллекции.Net 4.0 (например, ConcurrentQueue).
Конечно, вы также найдете в Интернете несколько фрагментов, например, неизменную очередь Джомо.