Каковы самые большие различия между F # и Scala?

59

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

Каковы самые большие различия между F # и Scala, несмотря на то, что F # разработан для .NET и Scala для платформы Java?

Jonas
источник
2
Если вы можете голосовать и считаете, что это полезный вопрос или у него есть полезные ответы ниже, пожалуйста, проголосуйте. Для создания хорошего сообщества сайтам StackExchange нужны голоса. Вы можете отдавать 30 голосов в день, не тратьте их впустую. Специально для пользователей с высокой репутацией и низким количеством подсчитанных голосов, пожалуйста, прочитайте это: meta.programmers.stackexchange.com/questions/393/…
Maniero
functional programming langugages that don't force the developer to only use immutable datatypes- есть ли, кроме, может быть, игрушечные языки?
Инго
1
@ Инго, если вы думаете, что ML и Ocaml не могут считаться функциональными языками программирования, поскольку они допускают изменчивость, возможно, вам следует изменить свое определение!
Фрэнк Шиарар
3
+ Фрэнк, вы, наверное, неправильно поняли: я имею в виду, что даже в Haskell есть изменяемые типы данных. Следовательно, я все еще хотел бы знать, какие языки @Jonas может иметь в виду, что заставило бы использовать только неизменяемые типы данных?
Инго

Ответы:

61

Основные отличия:

  • И Scala, и F # объединяют OO-императивное программирование и функциональное программирование в одном языке. Однако их подход к объединению парадигм сильно отличается. Scala пытается объединить две парадигмы в одну (мы называем это объектно-функциональной парадигмой), тогда как F # обеспечивает две парадигмы рядом друг с другом. Например, алгебраические типы данных в F # являются чисто функциональными конструкциями без ООП в них, тогда как ADT в Scala все еще являются обычными классами и объектами. (Примечание. В процессе компиляции в байт-код CLR даже ADT F # становятся классами и объектами, но они не видны программисту F # на уровне исходного кода.)

  • F # имеет полный вывод типа Хиндли-Милнера. Scala имеет частичный вывод типа. Поддержка подтипов и чистых OO-сущностей делает вывод типов в стиле Хиндли-Милнера невозможным для Scala.

  • Scala - гораздо более минималистичный язык, чем F #. Scala имеет очень маленький ортогональный набор конструкций, которые повторно используются во всем языке. F #, кажется, вводит новый синтаксис для каждой мелочи, таким образом, становится очень тяжелым по сравнению с Scala. (У Scala 40 ключевых слов, тогда как у F # 97. Это должно вам кое-что сказать. :-)

  • F #, будучи языком Microsoft, имеет отличную поддержку IDE в форме Visual Studio. На стороне Scala все не так хорошо. Плагин Eclipse все еще не на высоте. То же самое касается плагина NetBeans. Кажется, IDEA - ваша лучшая ставка на данный момент, хотя она даже не приближается к тому, что вы получаете в Java IDE. (Для поклонников Emacs есть ENSIME. Я слышал много хорошего об этом пакете, но я еще не пробовал.)

  • Scala имеет гораздо более мощную (и сложную) систему типов, чем F #.


Другие отличия:

  • Функции F # карри по умолчанию. В Scala карри доступно, но используется не очень часто.

  • Синтаксис Scala представляет собой сочетание синтаксиса Java, Standard ML, Haskell, Erlang и многих других языков. Синтаксис F # основан на синтаксисе OCaml, C # и Haskell.

  • Scala поддерживает более высокие типы и классы типов. F # нет.

  • Scala гораздо более поддается DSL, чем F #.


PS: я люблю и Scala, и F # и надеюсь, что в будущем они станут доминирующими языками своих платформ. :-)

missingfaktor
источник
6
Этот ответ увековечивает несколько заблуждений. Я перечислю каждого по очереди. Вы сказали, что «алгебраические типы данных в F # являются чисто функциональными конструкциями без ООП в них», но алгебраические типы данных в F # - это просто класс и, в частности, они поддерживают расширение с помощью экземпляров / статических членов и свойств ОО.
Джон Харроп
7
Вы говорите: «Scala пытается объединить две парадигмы в одну (мы называем это объектно-функциональной парадигмой)», но в Scala отсутствует общее исключение хвостовых вызовов и, следовательно, нетривиальный функциональный код (включая почти все обычные функциональные идиомы, такие как передача продолжения). стиль и развязывание рекурсивного узла) склонны к переполнению стека в Scala и, следовательно, практически бесполезны.
Джон Харроп
4
@JonHarrop: Scala специально не лечит ADT. К ним относятся как к обычным занятиям. Вследствие этого Some(2)в Scala есть тип Some[Int]а не Option[Int]нежелательный IMO. F #, с другой стороны, имеет специальный синтаксис и обработку для ADT, и, таким образом, может правильно выводить тип Some 2as int option. Таким образом, кодирование ADT в F # лучше, чем в Scala (IMO, конечно). Я не пытался подразумевать, что это уступает, и мне жаль, если это встретилось таким образом.
фактор
9
@JonHarrop: отсутствие TCO в JVM не беспокоило многих разработчиков Scala. Поверь мне, это не такая большая проблема, как ты думаешь. В большинстве случаев мы используем функции более высокого порядка вместо явной рекурсии. И большинство функций более высокого порядка в Scala реализованы с точки зрения циклов, а не рекурсии. Таким образом, недостаток TCO становится близким к несущественному.
фактор
8
Я чувствую, что весь этот ответ немного пристрастен к Скале. Например, Scala является гораздо более минималистичным языком, чем F #, что, кажется, идет вразрез с его аргументом / более поздней точкой более сложной системы типов.
Адам Gent
9
  • F # сконцентрирован на функциональных аспектах, а scala основан на объектно-ориентированных аспектах.
  • F # имеет лучшую поддержку IDE с Visual Studio, а плагин Scala для Eclipse предназначен для IDE с открытым исходным кодом и сравнительно медленнее.
  • F #, будучи более ML-подобным, чем Scala, имеет больше минимального лямбда-исчисления, чем OCaml, Standard ML и Scheme. F # выглядит значительно более простым языком.
Аюш Гоял
источник
4
«F # выглядит значительно более простым языком». << Нет, это не так. Это намного больше, чем Скала. Я должен написать статью на эту тему некоторое время.
фактор
4
«Scala основана на объектно-ориентированных аспектах». << Неправильно. Scala пытается объединить ООП и функциональное программирование. Лично я очень редко использую его объектно-ориентированные возможности. Большая часть того, что мы делаем, является чисто функциональной.
фактор
@missingfaktor: «Это намного больше, чем Scala». Насколько велики грамматики?
Джон Харроп
1
Я не знаю, изменились ли вещи. Скала в IntelliJ качается, с плагином все еще с открытым исходным кодом.
Colliot
0

Одним из небольших, но важных моментов является лицензия: Scala - это BSD (в значительной степени самая либеральная лицензия на свободное программное обеспечение), F # раньше был «лицензионным соглашением Microsoft Research Shared Source», но в настоящее время это коммерческий продукт (согласно @Lorenzo ниже, хотя я нигде не мог найти более конкретные лицензионные соглашения).

Joonas Pulakka
источник
3
На самом деле, F # теперь с открытым исходным кодом, а Scala - коммерческий продукт компании Scala Solutions Мартина Одерского.
Джон Харроп
4
@Jon Harrop: Я думаю, что Scala Solutions продает только связанные с Scala инструменты, услуги, обучение и т. Д. Сам язык, по-видимому, все еще находится под лицензией BSD.
Joonas Pulakka
2
@Joonas: Точно, то же самое относится и к F #.
Джон Харроп
5
@JonHarrop: Scala остается открытым исходным кодом. Пожалуйста, не распространяйте дезинформацию.
фактор
2
@missingfaktor: Я не говорил, что Scala был закрытым источником.
Джон Харроп