Я должен изучить Haskell или F#, если я уже знаю OCaml? [закрытый]

Проблема в том, что если один из узлов пути не обладает свойством name, то вся проверка не будет пройдена.

Так или же мы проверяем на наличие свойства :

match p=allShortestPaths((n)-[*]-(m)) 
where 
    n.title = 'The Replacements' and 
    m.title = 'Speed Racer' and
    NONE(n in nodes(p) where EXISTS(n.name) and n.name = "Keanu Reeves")
return p

Или используем функцию COALESCE :

match p=allShortestPaths((n)-[*]-(m)) 
where 
    n.title = 'The Replacements' and 
    m.title = 'Speed Racer' and
    NONE(n in nodes(p) where COALESCE(n.name, '') = "Keanu Reeves")
return p

24
задан 2 revs, 2 users 100% 18 April 2011 в 23:10
поделиться

7 ответов

Долголетие

  • Haskell является де-факто доминирующим языком исследований функционального программирования. Haskell 98 прослужит еще много лет в стабильной форме, а то, что называется Haskell, может продлиться от 10 до 30 лет - хотя язык будет продолжать развиваться. Сообщество вкладывает большие средства в Haskell, и даже если завтра основные разработчики GHC столкнутся с автобусом (известная проблема «ошибка шины в Кембридже»), есть множество других, которые могут подойти к делу. Есть и другие, менее сложные компиляторы.

  • Caml контролируется небольшой группой в INRIA, французской национальной лаборатории. Они также имеют значительные инвестиции, другие также вкладываются в Caml, и код с открытым исходным кодом, и компилятор не слишком сложен, так что он будет поддерживаться в течение длительного времени. Я предсказываю, что Caml будет гораздо более стабильным, чем Haskell, так как кажется, что люди INRIA больше не используют его в качестве средства для изучения новых языковых идей (или, по крайней мере, они делают это с меньшей скоростью, чем в прошлом).

  • Кто знает, что будет делать компания? Если F # будет успешным, Microsoft может поддержать его в течение 20 лет. Если это не удастся, они могут отключиться в 2012 году. Я не могу догадаться и не буду пытаться.

Практичность

Хеш-таблица - лучшая структура для быстрого поиска. Сторонники Haskell предлагают использовать Data.Map, представляющий собой двоичное дерево.

Это зависит от того, что вы ищете. Когда ваши ключи являются строками, троичные деревья поиска часто работают быстрее, чем хеш-таблицы. Когда ваши ключи целые, двоичные деревья Патрисии Окасаки и Джилла конкурируют с хешированием. Если вы действительно хотите, Вы можете построить хэш-таблицу в Haskell, используя монаду ввода-вывода, но это редко требуется.

Я думаю, что всегда будет потеря производительности для отложенной оценки. Но «практический» - это не то же самое, что «как можно быстрее». В отношении производительности справедливо следующее:

  • Проще всего предсказать поведение программы Caml во времени и пространстве.

  • F # находится посередине (кто действительно знает, что будут делать .NET и JIT?).

  • Труднее всего предсказать поведение программ на Haskell во времени и пространстве.

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

Я хочу иметь возможность разрабатывать больше чем просто парсеры и математические программы.

Чтобы понять, что в Хаскеле возможно, посмотрите менеджер окон xmonad и обширный массив пакетов на hackage.haskell.org .

Мне не нравится быть привязанным к громоздкой платформе .NET, если преимущества не велики.

Я не могу комментировать:

Хорошо спроектировано

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

Некоторые моменты, по которым следует оценивать согласованность:

  • конкретный синтаксис Haskell чрезвычайно хорошо разработан; Я постоянно впечатлен хорошей работой комитета Haskell. Синтаксис OCaml в порядке, но страдает от сравнения. F # начинался с синтаксиса ядра Caml и имеет много общего.

  • У Haskell и OCaml есть очень последовательные истории о перегрузке операторов. У Haskell есть последовательный и мощный механизм, который вы можете расширить сами. OCaml не имеет никакой перегрузки.

  • OCaml имеет простейшую систему типов, особенно если вы не пишете объекты и функторы (чего не делают многие программисты Caml, хотя мне кажется безумным не писать функторы, если вы пишете ML). Система типов в Haskell амбициозна и мощна, но она постоянно совершенствуется, что означает, что в результате истории есть некоторая несогласованность. F # по существу использует систему типов .NET плюс ML-подобный полиморфизм Хиндли-Милнера (см. Вопрос «Что такое Хиндли-Милнер» .)

  • OCaml не совсем согласен с тем, считает ли он варианты статически типизированный или динамически типизированный, поэтому он предоставляет как («алгебраические типы данных», так и «полиморфные варианты»). Получающийся в результате язык обладает большой выразительной силой, что отлично подходит для экспертов, но какая конструкция использовать не всегда очевидна для любителя.

  • OCaml ' Порядок оценки официально не определен, что является плохим выбором дизайна для языка с побочными эффектами. Хуже того, реализации противоречивы: виртуальная машина с байт-кодом использует один порядок, а компилятор встроенного кода использует другой.

66
ответ дан 28 November 2019 в 22:06
поделиться

Это не было одним из ваших критериев, но рассматривали ли вы наличие работы ? В настоящее время Haskell перечисляет 144 рабочих места, Ocaml - 12 и C # - 26 000. Эти цифры не идеальны, но могу поспорить, что после того, как F # выйдет, пройдет немного времени, прежде чем он пролетит мимо Хаскелла и Окамла по количеству списков вакансий.

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

20
ответ дан 28 November 2019 в 22:06
поделиться

Стоит ли изучать F # или Haskell, если вы знаете OCaml?

Я считаю, что ответ, безусловно, да, в идеале вы должны выучить все три языка, потому что у каждого есть что предложить, но F # - это только один со значительным будущим, поэтому, если вы можете изучать только один язык, изучите F #, читая мою Visual F # 2010 для книги по техническим вычислениям или подписавшись на наш журнал F # .NET

Longevity

Microsoft взяла на себя обязательство поддерживать F #, когда они выпустили его в рамках Visual Studio 2010 в апреле. Таким образом, F # гарантировано радужное будущее в течение по крайней мере нескольких лет. Благодаря мощному сочетанию практически важных функций, таких как высокопроизводительный REPL с собственным кодом, высокоуровневые конструкции для параллелизма, встроенные в .NET 4, и режим IDE производственного качества, F # намного далеко впереди любого другого функционального языка программирования с точки зрения реальной применимости в настоящее время. Честно говоря, никто даже не работает над чем-то, что может конкурировать с F # в ближайшем будущем. Мой собственный проект с открытым исходным кодом HLVM является попыткой сделать это, но он далеко не готов.

Напротив, и OCaml, и Haskell разрабатываются в крайне непродуктивных направлениях. Это убивает OCaml уже несколько лет, и я ожидаю, что Haskell последует его примеру в течение следующих нескольких лет. Большинство бывших профессиональных программистов на OCaml и Haskell уже перешли на F # (например, Credit Suisse, Flying Frog Consultancy), и большинство остальных, несомненно, перейдут на более практичные альтернативы, такие как Clojure и Scala, в ближайшем будущем.

В частности, OCaml ' Лицензия QPL запрещает кому-либо еще исправлять растущее число фундаментальных ошибок проектирования (ограничения строки и массива 16 МБ на 32-разрядных машинах, отсутствие параллелизма с общей памятью, отсутствие типов значений, параметрический полиморфизм посредством стирания типов, интерпретированный REPL, громоздкий FFI и т. д. ) потому что они должны распространять производные работы только в виде патчей к оригиналу, а сопровождающие пакета Debian отказываются признавать альтернативный апстрим. Новые функции, добавляемые в язык, такие как первоклассные модули в OCaml 3.12, далеко не так ценны, как это было бы с многоядерными возможностями.

Некоторые проекты были начаты в попытке сохранить OCaml, но они оказались слишком немного поздно Параллельный ГХ практически бесполезен, и Дэвид Теллер покинул проект с включенными батареями (хотя он был собран и выпущен в урезанном виде). Следовательно, OCaml превратился из самого популярного функционального языка в 2007 году в серьезный спад сегодня: с 2007 года трафик в списке списков упал более чем на 50% .

В Haskell меньше промышленных пользователи, чем OCaml и, хотя он имеет многоядерную поддержку, он все еще развивается в очень непродуктивном направлении. Haskell разрабатывается почти полностью двумя людьми из Microsoft Research в Кембридже (Великобритания). Несмотря на то, что чисто функциональное программирование отрицательно сказывается на производительности, они продолжают пытаться разрабатывать решения для параллельного Haskell, ориентированные на многоядерные системы, когда огромное количество ненужного копирования, которое оно берет на себя, попадает в стену памяти и разрушает любую надежду на масштабируемый параллелизм на многоядерных процессорах.

Единственный крупный пользователь Haskell в отрасли - Галуа с около 30 штатными программистами на Haskell. Я сомневаюсь, что они позволят Haskell полностью умереть, но это не значит, что они превратят его в более полезный язык.

Практичность

Я написал статью, которую вы цитировали о хеш-таблицах. Это хорошая структура данных. Другие люди ссылались на чисто функциональные альтернативы, такие как троичные деревья и деревья Патриции, но на практике они обычно примерно в 10 раз медленнее, чем хеш-таблицы. Причина заключается в том, что кеширование пропускает доминирующие проблемы с производительностью сегодня, и деревья подвергаются дополнительным косвенным указателям O (log n).

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

Вы сказали: «Мне не нравится быть привязанным к громоздкому .NET Framework, если преимущества не велики ". Преимущества огромны. Вы получаете IDE производственного качества, JIT-компилятор производственного качества, который выполняет чрезвычайно эффективные оптимизации, такие как дженерики, специализирующиеся на типах, библиотеки производственного качества для всего, от программирования GUI (см. Game of Life в 32 строках F # ) к числу хруст. Но реальное преимущество .NET, по крайней мере для меня, состоит в том, что вы можете продавать библиотеки, написанные на F #, и зарабатывать много денег. Никому еще не удавалось продавать библиотеки программистам OCaml и Haskell (и я один из немногих, кто пробовал), но библиотеки F # уже продаются в значительных количествах. Так что громоздкая платформа .NET того стоит, если вы хотите зарабатывать на жизнь написанием программного обеспечения.

Хорошо спроектированные

Эти языки хорошо спроектированы, но для разных целей. OCaml специально разработан для написания доказательств теорем, а Haskell специально разработан для исследования Haskell. F # был разработан для решения всех наиболее серьезных практических проблем с OCaml и Haskell, таких как плохая совместимость, отсутствие одновременной сборки мусора и нехватка современных современных библиотек, таких как WPF, для предоставления производительного современного языка большой аудитории.

24
ответ дан 28 November 2019 в 22:06
поделиться

F # и OCaml очень похожи по синтаксису, хотя, очевидно, F # является лучше с .NET.

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

В VS2010 будет включен F #, и, поскольку он компилируется в байт-код .NET, его можно использовать в ОС Windows, которая поддерживает используемую вами версию .NET. Это даст вам большую область, но есть ограничения, в настоящее время с F #, которых нет у OCaml, поскольку F #, похоже, не использует все процессоры на машине, но это, вероятно, связано с тем, что F # все еще разрабатывается. , и это может быть функция, которая пока не так важна.

Существуют и другие функциональные языки, такие как Erlang, на которые вы могли бы взглянуть, но, в основном,

3
ответ дан 28 November 2019 в 22:06
поделиться

На этот вопрос нет простого ответа, но вот некоторые вещи, которые следует учитывать:

Haskell и OCaml - зрелые языки с сильными реализациями. На самом деле, существует множество хороших реализаций Haskell, но я не думаю, что это является важным аргументом в его пользу для ваших целей.

F # намного моложе, и кто может предсказать, где Microsoft решит его использовать? То, как вы относитесь к этому, больше зависит от того, как вы относитесь к Microsoft, чем от того, что кто-либо может рассказать вам о языках программирования.

OCaml (или ML в целом) - хороший практический выбор языка, который поддерживает выполнение классных функциональных вещей, не заставляя вас работать так, чтобы это могло быть неудобно. Вы получаете все преимущества таких вещей, как алгебраические типы данных, сопоставление с образцом, вывод типов и другие любимые вещи. Да, и объекты.

Haskell дает вам все это (кроме объектов, в значительной степени), но также более или менее заставляет вас переосмыслить все, что, как вы думаете, вы знаете о программировании. Это может быть очень хорошо, если вы хотите узнать что-то новое, но это может быть больше, чем вы хотите откусить. Я говорю это как человек, который, может быть, только на полпути к тому, чтобы стать продуктивным и счастливым программистом на Haskell.

И OCaml, и Haskell используются для написания множества различных типов программ, не только компиляторов, ИИ или чего-то еще. Google - ваш друг.

И последнее замечание: OCaml предоставляет вам хеш-таблицу, но вряд ли разумно использовать ее в коде, если вы действительно хотите использовать функциональное программирование. Постоянные деревья (такие как Data.Map) действительно являются правильным решением для Haskell и имеют множество хороших свойств,

6
ответ дан 28 November 2019 в 22:06
поделиться

Долговечность

Никто не может предсказать будущее, но

  • OCaml и Haskell успешно выживают в течение ряда лет, что является хорошим предзнаменованием для их будущего
  • , когда появится F #. с VS2010 MS будет иметь юридические обязательства поддерживать его в течение как минимум 5 лет

Практичность

Перф: У меня недостаточно личного опыта работы с Haskell, но на основе информации из вторых и третьих рук, Я думаю, что OCaml или F # более прагматичны в том смысле, что я думаю, что маловероятно, что вы сможете получить такую ​​же производительность во время выполнения в Haskell, что и в OCaml of F #.

Библиотеки: легкий доступ к .Net Framework - огромное преимущество F #. Вы можете рассматривать его как «привязанный к этой громоздкой штуке», если хотите, но не забывайте, что «у вас есть доступ к огромной громоздкой библиотеке зачастую невероятно полезных вещей». ' подключение к .Net - один из главных аргументов в пользу F #. F # моложе, поэтому в нем меньше сторонних библиотек, но уже есть, например, FsCheck , FParsec , Fake и множество других, помимо библиотеки "в коробке" в .Net.

Инструменты: у меня недостаточно личного опыта для сравнения, но я думаю, что интеграция VS с F # превосходит все, что вы найдете для OCaml / Haskell сегодня (и В следующем году F # продолжит немного улучшаться).

Изменение: F # все еще меняется по мере приближения к своему первому поддерживаемому выпуску в VS2010, поэтому есть некоторые критические изменения в языке / библиотеке, которые вам, возможно, придется вынести в ближайшем будущем.

Хорошо спроектированный

Haskell определенно красив и согласован. Я недостаточно знаю OCaml, но мне кажется, что он столь же привлекателен. Я думаю, что F # `` больше '', чем любой из них, что означает больше запыленных углов и несоответствий (в основном из-за несоответствия импеданса между FP и .Net), но в целом F # все еще кажется мне `` чистым '', и Несоответствия, которые действительно существуют, являются, по крайней мере, хорошо аргументированными / преднамеренными.

В целом

На мой взгляд, вы будете в «хорошей форме», хорошо зная любой из этих трех языков. Если вы знаете большой долгосрочный проект, для которого хотите его использовать, один может выделиться,

13
ответ дан 28 November 2019 в 22:06
поделиться

Это не связано напрямую с вопросом OP о том, изучать ли F # или нет, а скорее с примером реального использования OCaml в финансовом секторе: http://ocaml.janestreet.com/?q=node/61

Очень интересный доклад.

1
ответ дан 28 November 2019 в 22:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: