Что-то я давно ничего не писал. Буду исправляться.
За последнее время я слегка разочаровался в F# и находился в неком поиске себя и тех инструментов, которые мне было бы интересно изучить и использовать.
Наверно стоит сказать пару слов почему я отказался от F#.
За последнее время я слегка разочаровался в F# и находился в неком поиске себя и тех инструментов, которые мне было бы интересно изучить и использовать.
Наверно стоит сказать пару слов почему я отказался от F#.
- Плохой компилятор. В общем то всё хорошо, но дьявол кроется в мелочах. И одна из этих мелочей - rec. Нет, он честно раскрывается в цикл, когда может, вот только когда функция чуть побольше пары строк, то уследить за тем, чтобы все рекурсивные вызовы были правильно сделаны не всегда получается. Ну и следовательно приходится ловить StackOverflow exception в рантайме. Не весело в общем.
- Синтаксис. Да он кажется красивым, но это ровно до того момента, пока ты не пишешь чего-либо больше сотни строк (и не вылизываешь их по пол дня). А чем больше кода, тем стремительнее он пытается превратиться в кашу. Из этого следуют две следующие проблемы.
- Выразительность кода на F# иногда может сыграть с программистом в довольно плохую шутку. Выразительность усложняет код, т.е. вносить правку в F# код значительно сложнее, чем в C/C++/C#/python код. Не потому, что сложнее написать пару символов, а потому что приходится дольше вникать в кусок кода, чтобы понять, где нужно поправить.
- Синтаксис F# сложен, при этом в компиляторе есть косяки и не все заявленные в том же MSDN фичи работают + проблемы с автовыводом типов (приходится иногда ручками прописывать, либо изменять код на аналогичный, но для которого типы выводятся). Это заставляется писать более "грязный" код.
В общем и целом я отношусь к F# положительно, но пока буду ждать, как будут развиваться компилятор и среда разработки под него.
Ах да, на НГ игрался с Mailbox + ZMQ, получилось забавно, хотя пришлось дополнительно использовать стандартные Thread для запуска ZMQ сокетов, т.к. Mailbox довольно мутно рулит потоками и, по умолчанию, должен использовать однопоточную обработку сообщений.
В любом случае сейчас я с .Net и C#/F# не работаю. Пересел на Java + Clojure и раскуриваю Gephi и gephi-toolkit, хотя качество документации к ним не фонтан. Первые пробы Clojure оказались довольно неплохи. Важным оказалось то, что после F# я смог быстро адаптироваться к recur. Что же, попробую заставить себя перевести https://github.com/gephi/gephi-toolkit-demos на Clojure, главное чтобы запала хватило :)
Я тут у Вас не местный, но всё-таки.
ОтветитьУдалитьУдостоверяться в tail rec calls просто. Достаточно делать так, чтобы в каждой ветке ЯВНО прописывался ПОСЛЕДНИМ. Причём не инструкцией последней, а последним словом:
вместо trFactorial (x - 1) (acc * x)
писать
(x - 1) (acc * x)
|> trFactorial
Или классический Seq.unfold.
Don Syme давно думает о том, как сделать атрибут, которым можно было бы помечать метод. И компилятор падал бы, если у него не получился tail rec.
Ну это больше на хак смахивает и противоречит самой идее синтаксического сахара. Вот атрибут - это да, было бы хорошо, было бы здорово, если бы его ввели в F# 3.0.
ОтветитьУдалитьПосле некоторый привычки функция автоматом получаютс хвосторекурсивные, а если алгоритм не хвостовой то в параметры добавляется continuation.
ОтветитьУдалитьВопрос вникания тоже решается с опытом, после F# код на C# выглядит кашей которую никак не исправить.
Необходимость понимать алгоритм вывода типов к плюсам отнести конечно нельзя, но спасет, что алгоритм довольно прост.
Про mailbox сложно сказать сраху, но возможно решением было бы запускать async из обработчика сообщения.
> Вопрос вникания тоже решается с опытом, после F# код на C# выглядит кашей которую никак не исправить.
ОтветитьУдалитьСильно зависит от кода на F# и C#. И там и там можно наворотить ужаса.
> Про mailbox сложно сказать сраху, но возможно решением было бы запускать async из обработчика сообщения.
Так не всегда можно сделать. Я использовал связку mailbox + ZeroMQ. Вот только на сокеты ZMQ накладывается ограничение по потоку и async там не вариант + слушать то сокет надо. Засунуть сообщение в mailbox просто, а вот передать ответ от mailbox в сокет - чуть труднее и требует костыля.
Без кода тут не разобрать.
ОтветитьУдалить