Совместимость кода между OCaml и F #
Добрый день,
Я разрабатываю небольшой проект для хобби в OCaml. Мне было интересно, как легко было бы перенести его на F #. Я знаю, что у F # есть некоторые функции, которые OCaml не делает, но я надеялся, что мой OCaml-код потребует мало усилий для порта. Мне не обязательно мигрировать, я хочу сохранить/разработать на обеих платформах.
Спасибо заранее,
Майкл
Ответы
Ответ 1
Написание кода кросс-компиляции выглядит для меня миром боли. Джон Уитингтон из Coherent PDF - единственный человек, которого я знаю о том, кто пытался сделать это в любой реальной степени.
Я перевел много кода OCaml в F # (возможно, больше, чем кто-либо еще в мире), а главными проблемами являются синтаксис #light
, использование любых нетривиальных функций OCaml (объектов, полиморфных вариантов, модули порядка, помеченные и необязательные аргументы и т.д.), библиотеки (например, lablgl, lablgtk, ocamlgraph, laziness), макросы (синтаксический анализ, потоки, шаблонные соответствия) и изменения в базовом синтаксисе, такие как индексирование массива. Например, я просто попытался перенести тест Almabench с OCaml на F #, и потребовалось несколько часов, потому что мне пришлось переписать каждый a.[i]
to a.(i)
вручную из-за множества ошибок в компиляторе F #: его режим совместимости с OCaml довольно хрупкий.
Поэтому я бы посоветовал вам выбирать между языками, а не пытаться перекрестно скомпилировать.
Ответ 2
Вы должны прочитать последнюю часть спецификации
Особенности совместимости ML
и обязательно возьмите файл FSharp.PowerPack.Compatibility.dll из PowerPack для различных библиотек-совместителей.
Ответ 3
Я не делал OCaml для F # -портации, но я знаю, что F # был разработан с учетом совместимости с OCaml. Как я знаю, F # в основном является надмножеством базового OCaml.
Он должен поддерживать (и без #light
ограничиваться) большинством ключевых слов OCaml и иметь эквиваленты большинства стандартных функций в основных библиотеках (или в .Net framework). Поэтому я бы предположил, что, по крайней мере, для хобби-проектов - портирование должно быть действительно легким.
F # не имеет системы OCAMl advanced module, поэтому у вас возникнут проблемы с реализацией, например. функторы.