Які найбільші відмінності між F # і Scala?


59

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

Які найбільші відмінності між F # і Scala, незважаючи на те, що F # розроблений для .NET і Scala для платформи Java?


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
@Ingo, якщо ви думаєте, що ML та Ocaml не кваліфікуються як функціональні мови програмування, оскільки вони дозволяють змінювати, можливо, вам слід скорегувати своє визначення!
Френк Шірар

3
+ Френк, ви, мабуть, неправильно зрозуміли: я маю на увазі, навіть у Haskell є змінні типи даних. Отже, я все-таки хотів би знати, які мови @Jonas має на увазі, що змусить використовувати лише незмінні типи даних?
Інго

Відповіді:


61

Основні відмінності:

  • І Scala, і F # поєднують програмування, необхідне для OO, та функціональне програмування на одній мові. Однак їхній підхід до об'єднання парадигм сильно відрізняється. Скала намагається об'єднати дві парадигми в одну (ми називаємо її об'єктно-функціональною парадигмою), тоді як F # надає дві парадигми поряд. Наприклад, алгебраїчні типи даних у F # - це суто функціональні конструкції, що не мають в них OO'ness, тоді як ADTs у Scala все ще є звичайними класами та об'єктами. (Примітка. У процесі компіляції в байт-код CLR навіть F # ADT стають класами та об'єктами, але вони не видно програмісту F # на вихідному рівні.)

  • F # має повні умовиводи типу Hindley-Milner. Скала має часткові умовиводи. Підтримка субтипування та чистого OO-ness робить висновок про стиль Hindley-Milner для 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 #, і сподіваюся, що вони стануть переважаючими мовами відповідних платформ у майбутньому. :-)


6
Ця відповідь увічнює кілька помилок. Я перерахую кожного по черзі. Ви сказали, що "типи алгебраїчних даних у F # - це суто функціональні конструкції, в яких немає OO'ness", але алгебраїчні типи даних у F # - просто клас, і, зокрема, вони підтримують розширення з примірниками / статичними елементами та властивостями OO.
Джон Харроп

7
Ви говорите: "Скала намагається об'єднати дві парадигми в одну (ми називаємо її об'єктно-функціональною парадигмою)", але Скала не має загального усунення хвостових викликів і, отже, будь-якого нетривіального функціонального коду (включаючи майже всі звичайні функціональні ідіоми, такі як продовження передачі стиль та відкручування рекурсивного вузла) схильні до утворення переливів у Scala і, отже, практично марні.
Джон Харроп

4
@JonHarrop: Скала не ставиться до АДТ спеціально. До них ставляться так само, як до звичайних занять. Для цього Some(2)у Scala є тип, який Some[Int]не Option[Int]є небажаним ІМО. F # на інший з іншого боку має спеціальний синтаксис і лікування АТД, і таким чином , може правильно вивести тип , Some 2як int option. Тож F # кодування ADT є кращим, ніж у Scala (IMO, звичайно). Я не намагався натякнути на те, що вона неповноцінна, і мені шкода, якщо вона трапилася саме так.
зниклий фактор

9
@JonHarrop: Нестача TCO у JVM не турбувала багатьох розробників Scala. Повірте, це не настільки велике питання, як здається вам здається. Здебільшого ми використовуємо функції вищого порядку замість явної рекурсії. І більшість функцій вищого порядку в Scala реалізуються з точки зору циклів, а не рекурсії. Отже, нестача ТСО стає близькою до несуттєвої.
зниклий фактор

8
Я відчуваю, що вся ця відповідь трохи упереджена до Скали. Наприклад, Scala є набагато більш мінімалістичною мовою, ніж F #, яка, здається, суперечить його аргументу / пізнішої точки зору більш складної системи типу.
Адам Гент

9
  • F # вирішується на функціональних аспектах, тоді як масштаб базується на об'єктно-орієнтованих аспектах.
  • F # має кращу підтримку IDE за допомогою Visual studio, тоді як плагін затемнення Scala призначений для IDE з відкритим кодом та порівняно повільніше.
  • F #, будучи більш схожим на ML, ніж Scala, має більшу кількість мінімального обчислення лямбда-у, як відчувають OCaml, Standard ML та Scheme. F # видається значно спрощеною мовою.

4
"F # видається значно спрощеною мовою." << Ні, це не так. Це набагато більше, ніж Скала. Я повинен написати статтю на цю тему деякий час.
зниклийфактор

4
"Scala заснована на об'єктно-орієнтованих аспектах." << Неправильно. Scala намагається сплатити OOP І функціональне програмування. Я особисто дуже рідко використовую його об'єктно-орієнтовані риси. Більшість з того, що ми робимо, є суто функціональним.
зниклий фактор

@missingfaktor: "Це набагато більше, ніж Скала". Наскільки великі граматики?
Джон Харроп

1
Я не знаю, чи все змінилося. Скала в скелях IntelliJ, плагін все ще відкритий.
Коліот

0

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


3
Власне, F # тепер є відкритим кодом, а Scala тепер є комерційним продуктом компанії Scala Solutions компанії Мартіна Одерського.
Джон Харроп

4
@Jon Harrop: Я думаю, що Scala Solutions продає лише інструменти, послуги, навчання тощо, пов'язані зі Scala. Сама мова все ще здається ліцензією BSD.
Joonas Pulakaka

2
@Joonas: Точно так само і у F #.
Джон Харроп

5
@JonHarrop: Scala залишається відкритим кодом. Будь ласка, не поширюйте дезінформацію.
зниклийфактор

2
@missingfaktor: Я не казав, що Scala є закритим джерелом.
Джон Харроп
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.