LINUX.ORG.RU

Нубский взгляд на языки функционального программирования

 , , ,


1

7

Привет!

Какого-то серьезного опыта с функциональными языками программирования у меня нет, но в последнее время я интересуюсь этой областью и пока не сделал выбор в пользу того или иного языка.

  • Haskell — чистый функциональный, библиотек много, развитая инфраструктура, высокий порог вхождения. Компиляторы, верификаторы, финансы.
  • SML/OCaml — классика функционального программирования, относительно низкий порог вхождения. В индустрии применяются жостаточно редко: компиляторы, верификаторы, финансы, числодробилки.
  • Scala — гибридный язык, развитая система типов, интероп с джавой. Высокий порог вхождения. Финансы, корпоративный сектор.
  • Agda/Coq — мощная система типов, экстрация программ в разные языки, верификация. Компиляторы, верификаторы.
  • F# — гибридный язык, дотнет/моно. Корпоративный сектор.

А теперь вопрос: с точки зрения изучения теории типов и прочего матана, который стоит за языками программирования, какой язык лучше взять?

Перемещено mono из talks



Последнее исправление: CYB3R (всего исправлений: 1)
Ответ на: комментарий от Norgat

Common Lisp не является функциональным

you made may day!

(хотя на неё и можно писать в таком стиле).

А стиль гранжа или диско умеет?

comp00 ★★★★
()
Последнее исправление: comp00 (всего исправлений: 2)
Ответ на: комментарий от no-dashi

Много ты софта на эрланге видел, живого, кроме ejabberd, конечно

Каждый рабочий день я работаю с:

  • rabbitmq — менеджер сообщений;
  • riak — kv-хранилище;
  • tsung — софтина для нагрузочного тестирования, умеет в HTTP, XMPP, LDAP + можно писать свои расширения на Erlang;
  • flussonic — софтина для стриминга видео на кучу устройств, начиная от десктопов и заканчивая китайскими приставками.

плюс есть куча кода для внутреннего использования, которая вряд ли будет опубликована в открытом доступе.

ymn ★★★★★
()
Ответ на: комментарий от buddhist

Вот в этом комменте неплохо описаны проблемы, возникающие там, где используется императивный подход совместно с функциональным. Хаскель, например, существует для того, чтобы отделять мух от котлет. А в CL ничего не мешает прострелить себе ногу. Хотя, да, на нем возможно писать в функциональном стиле.

feofan ★★★★★
()
Ответ на: комментарий от feofan

Которое знает о том, что Common Lisp мультипарадигменный

Почти весь код, который пишут CL'еры, далеко не функционален (в современном понимании). Собственно, это необходимое и достаточное условие того, что CL не функциональный.

Вот Scheme — это уже другой разговор.

anonymous
()
Ответ на: комментарий от ymn

А теперь сравни этот список с количеством аналогичных продуктов не на функциональных языках? И как результат? Даже не сравним, верно?

P.S.: что забавно - почему SAA привел тот же самый список??

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

А теперь сравни этот список с количеством аналогичных продуктов не на функциональных языках?

А зачем мне это? Ты спросил, мол, много ли ты видел эрланго-софта, на что я тебе ответил, что, да, я видел много такого софта.

Я не собираюсь спорить о том, что на си/питоне/перле/фортране написано в 100500 раз больше кода.

Мне непонятно одно, зачем приходить в тред в котором обсуждают теорию типов (ты ведь знаешь что это такое?) и набрасывать говнецо на вентилятор?

В первом посте ТС отчетливо дал понять, что его интересует теория.

что забавно - почему SAA привел тот же самый список

Очевидно потому, что это популярные проекты, которыми пользуются многие программисты, не?

ymn ★★★★★
()
Ответ на: комментарий от anonymous

в каком месте? Называя парадигму стилем, или считая common lisp нефункциональным? Отчасти да, он мультипаридигменный, но любой мультипарадигменный язык за основу берет отдельную парадигму, а остальные в качестве поддержки. Так что к. лисп все же функциональный, хотя и зародыш ООП там есть.

comp00 ★★★★
()
Ответ на: комментарий от anonymous

Почти весь код, который пишут CL'еры

А 90% кода на питоне содержит «ООП», хотя технически в питоне (2.х во всякор случае) никакого ООП нет. На С++ тоже если по извращаться можно писать функциональное ПО, но это не делает его функцианальным. Так что как пишут программисты это уже прикладной вопрос

comp00 ★★★★
()
Ответ на: комментарий от ymn

Очевидно потому, что это популярные проекты, которыми пользуются многие программисты, не?

Или потому, что особо больше и сказать нечего. Ага.

no-dashi ★★★★★
()

C++, серьезно. Все то немногое полезное, что можно было взять из функциональщины, там уже есть.

anonymous
()
Ответ на: комментарий от dmitry_malikov

Там есть, например, type providers, чего нет у всех прочих.

anonymous
()
Ответ на: комментарий от no-dashi

Это то, что доступно для всех. Подавляющее большинство проектов на функциональных языках используются в корпоративном секторе и ты узнаешь о них только от знакомого программиста за кружкой пива. Смирись и расслабься.

ymn ★★★★★
()
Ответ на: комментарий от Norgat

Если создать структуру, то используя setf

Не используй setf, в чем проблема то?

Deleted
()
Ответ на: комментарий от comp00

Отчасти да, он мультипаридигменный, но любой мультипарадигменный язык за основу берет отдельную парадигму, а остальные в качестве поддержки. Так что к. лисп все же функциональный, хотя и зародыш ООП там есть.

Лол, что? В основе Common Lisp функциональная парадигма?! Полный бред.

Common Lisp — практичный инженерный мультипарадигменный язык, не надо его ко всякому академическому хламу причислять.

anonymous
()
Ответ на: комментарий от ymn

лавсан?

Это который Emacs со Slime не осилил? Лол.

anonymous
()
Ответ на: комментарий от no-dashi

Думаю спорить дальше нет смысла. То, что на нем не так много проектов в паблике, как на яве или плюсах, это говорит немного о другом. На erlang пишут много ПО внутри, которое не будет открыто, примеров в гугле много.

SAA ★★★
()
Ответ на: комментарий от Norgat

А теперь посмотрим на Haskell, Erlang, OCaml - ЯП функциональная природа которых очевидна и заявлена создателями. Там никаких in-place преобразований не допускается

Допускается.

anonymous
()
Ответ на: комментарий от comp00

Так что как пишут программисты это уже прикладной вопрос

Да нет, то, как пишут программисты, язык и определяет. Обращаю внимание - как пишут, а не как _могут_ писать.

anonymous
()
Ответ на: комментарий от comp00

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

Это же ложь.

anonymous
()

F# — гибридный язык, дотнет/моно. Корпоративный сектор.

F# = ocaml прикрученый к dotnot

invy ★★★★★
()
Ответ на: комментарий от ymn

F# - надмножество подмножества OCaml. Умеет OCaml-ом бутстрапиться (или раньше умел).

anonymous
()

Какие же люди несамостоятельные пошли...

И опять же вижу старый спор, а насколько честен товарищ Горький язык программирования Common Lisp является функциональным.

dave ★★★★★
()

Кстати, сегодня обнаружил, что F# замечательно работает на маке. Можно писать в Aquamacs (emacs). Тогда не будет отличий от Haskell. А можно и в MonoDevelop. Не студия, конечно, но тоже вполне неплохо. Solutions (проекты) от микрософтовской студии собираются в Mono с командной строки и в среде MonoDevelop. Безмерно рад.

dave ★★★★★
()
Ответ на: комментарий от Norgat

Про Scala ничего не скажу - не знаю её.

scala пошли дальше, у них есть и mutable и immutable коллекции. Два отдельных пакета в стандартной библиотеке с полностью аналогичными коллекциями.

BattleCoder ★★★★★
()
Ответ на: комментарий от anonymous

Ты неправ. Haskell - отличный язык для обкатки идей. Он позволяет видеть главное. Модели получаются более правильными. Когда пишешь на гибридных функциональных языках (таких, как Common Lisp, Scala или F#), то всегда есть соблазн свернуть с верного пути, и наделать много конструктивных ошибок.

dave ★★★★★
()

F# это всего-лишь подможество ocaml, даже сами мелгомягкие не скарыают этого, незачем выносить его отдельным пунктом. По теме: для матана - Хаскель, ибо чистота языка, монады, моноиды, функторы и прочая ересь.

Aswed ★★★★★
()
Ответ на: комментарий от Aswed

F# это всего-лишь подможество ocaml

Прокомментирую. Это давно уже не так.

В части вещей F# ушел далеко вперед. Взять те же вычислительные выражения, которые позволили создать просто великолепную монаду асинхронных вычислений с очень удобным синтаксическим сахаром, а также позволили создать аналогичный синтаксический сахар для задания последовательностей, списков и массивов, да так, как нельзя даже в C# с его ключевым словом yield (по-моему в C# это работает только на уровне методов).

dave ★★★★★
()
Ответ на: комментарий от no-dashi

1С, ABAP4, VisualBasic, C#, Java

P.S.: функциональные языки пользуются заслуженой славо на ЛОРе и прочих гиковско-задротских ресурсах

Вы себя со своим списком к первым или вторым относите?

sf ★★★
()

вот неплохой сайт для старта; параллельно можно смотреть примеры отсюда. очень простым языком основы описаны здесь (PDF). это всё Agda, т.е. Мартин-Лёф; если хочется исчисления конструкций (читать работы Воеводского, например), то надо искать аналогичное по Coq

теория типов сама по себе может выступать как простой (и не очень удобный) ЯП - при известном желании можно самостоятельно написать интерпретатор

jtootf ★★★★★
()
Ответ на: комментарий от ymn

книжонка с теорией категорий на пальцах

книжонка очень хорошая, но в ней нет практически ничего SML-специфичного (все примеры на Haskell записываются без проблем), и в выводах автор жалуется на бедность системы типов (не позволяющую описать, например, индексированные категории)

jtootf ★★★★★
()
Ответ на: комментарий от comp00

А 90% кода на питоне содержит «ООП», хотя технически в питоне (2.х во всякор случае) никакого ООП нет.

Для тебя сюрприз, что питон объектно-ориентированный?

На С++ тоже если по извращаться можно писать функциональное ПО, но это не делает его функцианальным. Так что как пишут программисты это уже прикладной вопрос

Не надо извращаться, надо писать так, как пишут остальные люди. Сообщество — вот то, что определяет парадигму языка.

Прежде чем бравировать фразочками в стиле «называя парадигму стилем», потрудись узнать, что такое парадигма.

anonymous
()
Ответ на: комментарий от anonymous

Для тебя сюрприз, что питон объектно-ориентированный?

Для меня было сюрпризом что там нет инкапсуляции. Очень неприятным сюрпризом.

«называя парадигму стилем», потрудись узнать, что такое парадигма.

Совокупность понятий, определяющая правила написания программ.

Сообщество — вот то, что определяет парадигму языка.

Я буду откровенен: чуть было не написал что это абсурд, но вовремя одумался. Да, если поразмыслить это так, хотя достаточно неочевидно.

comp00 ★★★★
()
Ответ на: комментарий от stevejobs

позиция лавсана во все времена была одной:

Common Lisp — практичный инженерный мультипарадигменный язык, не надо его ко всякому академическому хламу причислять.

хотя может это и не он)

ymn ★★★★★
()
Ответ на: комментарий от ymn

Это факт, а кто его озвучивает, роли не играет.

anonymous
()

У вас неправильное деление языков.
Нужно делить не на функциональные-императивные.
А на «нужные» и «не нужные».
И выбирать из нужныхъ. Например из clojure, ruby и CL.

Int0l ★★
()
Ответ на: комментарий от Int0l

Парадигмы более-менее формализованы. Ваши «нужные» и «не нужные» - понятия нечеткие и субъективные. Например, на мой взгляд, CL не нужен.

anonymous
()
Ответ на: комментарий от Int0l

А на «нужные» и «не нужные»

Что это за бредятина? Кто будет оценивать нужность/ненужность? Все перечисленные языки так или иначе применяются в разработке/научной деятельности.

ymn ★★★★★
()

опыта ... нет
пока не сделал выбор

Вот тут бы и пригодился (мой) FAQ :)

Ну да ладно. я сегодня добрый. Выбирай для изучения F.

d_Artagnan ★★
()
Ответ на: комментарий от comp00

потрудись узнать, что такое парадигма.

Совокупность понятий, определяющая правила написания программ.

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

ovk48 ★★★
()
Ответ на: комментарий от ovk48

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

В гугль я залез сейчас и как выяснилось, что определение, данное мне в вузе 2 года назад полностью идентично определению в википедии. Мистика, не иначе.

comp00 ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.