Pull to refresh

Comments 39

А что известного разрабатывают на F#? Какая область применения вообще?

Jet.com например бекенд весь на F#. Объяснение почему


От себя:
F# умеет всё что и C# (ООП, наследование, интерфейсы, netcore 2.0 вот это вот всё) + много сверху (Discriminated Unions, partial application, type inference везде где можно, кастомные операторы и пр).
Для создания бекенда прям самое оно. Система типов круче, ошибиться сложнее.
Фронты писать в функциональном стиле тоже можно, попытки видел, мне лично не нравится.


Есть просто отдельные крутые нугеты:
Logary, Hopac

UFO just landed and posted this here
А вот это немного неправда

Почему же? Где можно, там выводит) Где не получается — надо ручками писать, да.


С фиксированным приоритетом, зависящем от первого символа afaik

Это намного лучше чем их полное отсутствие (дада, C#, я о тебе).
Вполне хватает на любые нужды:
>>=
>?>
>>=.
|>
||>
!>
?>
и пр.
Подробнее можно здесь посмотреть как сделать постфиксные, префиксные и инфиксные операторы — http://www.readcopyupdate.com/blog/2014/09/10/custom-ops-associativity-precedence.html

Это намного лучше чем их полное отсутствие

Мой опыт Scala говорит, что полное отсутствие было бы лучше. Когда приоритет операции -> и + оказывается одинаковый, это доставляет не малое удовольствие.
UFO just landed and posted this here

Не, не подзабил, т.к. F# всегда был у Microsoft языком второго сорта) Их продукт — C#, а F# делается командой Don Syme на гитхабе.


Поддержку .NET Core 2 в Visual Studio только-только завезли. Через год может быть паблиш F# проектов в Azure припилят =)


По поводу инфраструктуры только частично соглашусь. Для большинства библиотек хватает вот этих функций


let curry f a b = f (a, b)
let curry3 f a b c = f (a, b, с)

let uncurry f (a, b) = f a b
let uncurry3 f (a, b, c) = f a b c

чтобы свободно пользоваться преимуществами F#
На крайний случай можно небольшую обвязку сочинить поверх библиотеки с функциональным фасадом.


Кстати Newtonsoft.Json умеет работать с F# из коробки (списки, массивы, DU) кроме option. Достаточно добавить один кастомный Option Converter чтобы вообще всё заработало.


По поводу Jet.com любопытно. У них не так давно была волна агрессивного рекрутинга, где они предлагали "(high 5 to low 6 figures / year)", релокейт, но надо физически находиться в USA на момент обсуждения.
Если не секрет почему ушли из Jet.com?

UFO just landed and posted this here
UFO just landed and posted this here

Область применения схожа с С#, т.е. какие-то корп. решения. Вообще как инструмент очень полезен в сферах ML, кластерных вычислений, анализа больших данных, быстрого анализа данных. ± удобство отдельных библиотек, что-то более красиво и быстро можно написать на F#, нежели на С#, и встроить в более большой проект.


Известного, ну вот например:
https://www.microsoft.com/en-us/security-risk-detection/

MonoDevelop не умеет отлаживать .NET Core по лицензионным соображениям. И не научится. По ним же. Такой вот открытый опенсорсный дотнет-стек от майкрософта.

А почему Rider может? Там какие-то нюансы?

Райдеровцы первоначально пытались использовать clrdbg (он же vsdbg), но наткнулись на лицензионные препятствия. Софтинка сия выдаёт на старте следующее:


You may only use the Microsoft .NET Core Debugger (vsdbg) with Visual Studio Code, Visual Studio or Visual Studio for Mac software to help you develop and test your applications.

В итоге отладки для .NET Core полгода у них не было, так как пришлось делать свою собственную обвязку вокруг libdbgshim.so, которая из Mono работает с COM-интерфейсами coreclr.


В MonoDevelop же такую обвязку завозить никто не собирается — это теперь просто базовая платформа для VSforMac и Unity, а не самостоятельная полноценная среда разработки.

UFO just landed and posted this here
Эм…
let fst (a, b) = a
let snd (a, b) = b
UFO just landed and posted this here

Можно и так


let uncurry f (x, y) = f x y
let k x y = x
let k' x y = y

let fst<'a,'b> = uncurry k
let snd<'a,'b> = uncurry k'

Так pointless, извиняюсь, pointfree стиль — это самая мякотка функциональных языков.


 ((+) .) . flip flip 2 . ((+) .) . (*)

Красота!

Не то, чтобы я была фп-гуру, так что я могу и ошибаться. Но у меня есть подозрение, что читаемость и здравый смысл не обязательно класть на алтарь pointfree.
Что люди не сделают лишь бы на нормальном lisp не писать)
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here

Забыли добавить что большую часть времени будет тратится на возню и "срач" какие типы писать. Что затягивает сроки. Но не избавляет от ошибок.
При изменении бизнес требований, придется переписывать много когда, т.к. все жестко связано типами или вставлять костыли.

UFO just landed and posted this here

Не соглашусь с вашим тезисом, я очень долго работал на статически типизируемых языках со сложной системой типов: Java, Scala.
По итогу я не нашел преимуществ. Код очень сильно разбухает из-за типов. Изменение в бизнес логике превращаются в переписывание большого куска кода или костыли.
Разбираться в проектах написанных на языках со сложной системой типов очень трудно, если ты не автор. Нужно сперва изучить всю модель абстракции — за которой скрыта реальная логика работы.
Если вы утверждаете о каких то домашних проектах то ок, вы в праве писать на чем угодно, но мне слабо верится что в ваш работодатель будет ждать пока вы отрефакторите свою "идеальную" систему типов под новую задачу.
Скажу ещё так, используя Lisp с которым вы не согласились, а конкретно Clojure, вы напишете ваш проект значительно быстрее и ещё успеете все тестами прокрыть, за время которое вы обдумываете какие типы создать в Haskell, конечно если вам не хватит REPL'a для проверки всего (REPL oriented programming).

UFO just landed and posted this here

Вы считаете что написать много типов это так же быстро как их не писать. Для меня это звучит аналогично следующему — есть магазин в 100 метрах и я до него дойду за 1 минуту и есть магазин в 1000 метрах до которого вы добежите за 1 минуту, значит добираться до них как минимум однинаково по времени, а может и быстрее если бежать с большей скоростью.


Если бы у меня не было богатого опыта со Scala, на реальных крупных проектах, а не коленочных поделках, были бы сомнения насколько полезно писать программы с большим кол-во пользовательских типов и связей между ними.


Про вермишель на питоне/перле/схеме, тут вы передергиваете имхо, на этих языках можно решить задачу намного лаконичнее — компактно и без потери читаемости.
Конечно если вы на одну чашу весов ставите код на Haskell подобном языке где выстрадана структура типов и приведена к читаемому виду, а на другой написаный на коленке код на перечисленных языка, преимущества не на стороне последних, но вот если потратить времени не более чем на продумывание программы на типах, получиться то о чем я говорил — лаконично.

UFO just landed and posted this here
Друзья, когда Microsoft что-то всерьёз продвигает, то это происходит очень агрессивно (кроме просто рекламы в СМИ: слухи и их опровержения, скандалы в прессе, суды, обещания, разочарования, отставки и назначения, и море других страстей). Ничего похожего с F# и близко нет. Скорее это просто дань моде. Вот и всё.
Sign up to leave a comment.