Иногда очень хочется, чтобы F# был отделен от .NET. Чтобы программы на нем работали под юниксами и виндой без использования тяжелой виртуальной машины. Или, как минимум, все его новшества были портированы в окамл. Уж больно F# хорош!
Однако реализация F# иногда хромает. Например, в нем есть такие костыли как OptimizedClosures.FSharpFunc и FSharpFunc.InvokeFast. На деле это означает, что при вызове функции со многими аргументами задействуется RTTI, чтобы узнать, а есть ли прямой вызов функции, минуя каррирование. Во многом потому, что это снизу .NET. Подозреваю, что в окамле такой вызов функции сильно оптимизирован, и он не использует RTTI.
А какие у него новшества по сравнению с кемлом?
ОтветитьУдалитьГлавным образом, вычислительные выражения: comprehension для списков, массивов, ленивых последовательностей, синтаксис для монад типа async. Все это предоставляют вычислительные выражения. Это очень удобно, декларативно, и иногда меняет сам стиль программирования. Для окамла есть какая-то поддержка, но неофициальная.
ОтветитьУдалитьТесная интеграция с последовательностями. Для сравнения можно обратиться к кложуре. Последовательности важны.
Есть еще активный паттерн-матчинг. В некотором виде он существует еще в скале, но по-моему в F# более общая реализация.
Мне кажется, что эти вещи вполне можно было бы перенести в окамл.
Активный паттерн-матчинг решается camlp4, см. bitstring, mikmatch, а в общем виде вряд-ли подходит камлю, т.к. скрывает за тупой привычной деконструкцией (с константным рантайм эффектом) произвольный код.
ОтветитьУдалитьТесная интеграция с последовательностями есть в батарейках http://ocaml-batteries-team.github.com/batteries-included/hdoc/BatEnum.html. В них же есть comprehension который тоже поддерживает практически любые последовательности, включая и пользовательские модули http://batteries.forge.ocamlcore.org/doc.preview:batteries-beta1/html/extensions.html#comprehension
ОтветитьУдалитьВообще батарейки очень прилично улучшили OCaml.
Вот асинхронность с поддержкой SMP да так просто не перенесешь :(
Батарейки скачал, но на винде еще не установил. Примеры выглядят интересно.
ОтветитьУдалитьНо в F# этот comprehension поддерживает еще и циклы. Фактически while и for офункционаливаются, принимая форму вызова функций. То же происходит с монадами - они также могут работать с циклами. Императивные конструкции в итоге подменяются функциональными. В этом что-то есть философское :)