Использованием приёмов из функционального репертуара уже давно никого не удивишь -
использование различных map
, reduce
и filter
очень распространено. А писать как можно больше “чистых функций” рекомендуется
повсеместно. И всё же даже используются такие вот функциональные паттерны опыт написания программ на привычном JavaScript или Python
заметно отличается от “чистых” языков программирования - я практически могу гарантировать, что “функциональный код” на Python скорее
всего будет по большей части императивным.
F#
и Ocaml
- разумеется, function-first языки, но всё равно допускают некоторые поблажки относительно императивного кода,
а кроме того довольно большие и сложные в освоении.
Haskell
- пожалуй самый известный из чистых ФП языков, также печально известен своей сложностью и не самым удобным набором инструментов.
Но вот появился относительно свежий язык - Roc, который обещает все преимущества функционального программирования (со статической типизацией при этом), сохраняя доступность и относительную простоту.
Явный источник вдохновения - Elm, ведь создатель Roc
, Ричард Фельдман, один из контрибьютеров Elm
.
Однако последний явно заточен под frontend-использования, а Ричард хотел разработать язык такой же приятный в использовании как Elm
,
но при этом подходящий для Backend разработки, или создания CLI-инструментов.
А вот второй источник вдохновения - это как ни странно, Golang
. Roc
- пытается быть “чистым” функциональным языком, ориентируясь при этом на простоту, удобство и скорость Go
.
Т.е. это очень компактный синтаксис, встроенные “из коробки” инструменты, скорость компиляции.
Roc
на текущий день, как мне кажется - это самый быстрый способ испытать опыт программирования ФП,
практически ничто не отвлекает от того, чтобы сразу начать писать код, который будет делать “что-то” (вывод в консоль например), а не просто делать отвлечённую математику.
Походит ли Roc
в качестве первого функционального языка? Не уверен, вероятно лучше всё же начать с ФП-приёмов в каком-нибудь более популярном ЯП, познакомиться
с основными идеями функционального программирования, и затем испытать силы в написании чего-то тривиального на Roc
. Потому что хотя бы без примерного понимания
лямбда-функций и монад (хотя бы интуитивного) будет непросто понять как через Task’и работают IO-операции в Roc
.
Явный недостаток на текущий момент - явная молодость и незавершенность языка - многие текущие инструменты
планируется переработать (со временем откажутся от взаимодействия с IO при помощи Task’ов, планируется также добавить немного “императивного” сахара вроде for-loop
конструкций, но при этом не затрагивая функциональную основу языка). Например, посередине
написания игрушечного парсера логов я обнаружил что в нём нет встроенных регулярок - “крутить” строки одними split
функциями сомнительное удовольствие.
Также ошибки от компилятора часто дают мало информации для понимания того, что же пошло не та
Но для того, чтобы почувствовать опыт разработки на “чистом” ФП-языке Roc
подходит практически идеально - синтаксис можно освоить за пару дней
и сразу приступить к разработке.