LINUX.ORG.RU

Размышления, Scala vs F#

 , ,


0

3

Я использую Scala как свой основной рабочий инструмент уже около 8 лет. Вполне достаточно для того, чтобы в голове образовались рельсы, и чтобы, держа в руке молоток, любую задачу считать гвоздём. Для борьбы с этим я стараюсь держать себя в курсе интересных тенденций в дизайне языков. Вот, дошли руки и до F#. Давно уже собирался, а ещё и то, что Microsoft делает с .Net core, вызывает живой интерес.

Честно говоря, от F# я ожидал большего. Вот список того, что мне было бы интересно в нём найти:

  • Type classes. Без них грустно. И если в OCaml это компенсируется мощной системой модулей, то в F# мы имеем босый хрен.
  • Higher kinded types. Ибо без них тайпклассы имеют весьма ограниченный смысл.
  • Call by name. Полезная штука чтобы не писать каждый раз уродство типа fun () -> blah в аргументах функций.
  • Computation expressions для всех монад в стандартной библиотеке из коробки. Ребята, серьёзно? Запилить такую крутую штуку, и не положить в коробку реализацию даже для опций? Ну как это вообще называется?!
  • Макросы.
  • И на правах совсем уж странной хотелки. Доступ к компилятору как к библиотеке. В сочетании с такой прикольной фичей, как code quotations, это была бы бомба. Я недавно реализовывал транслятор SQL-like языка в Scala-код, который затем компилируется и выполняется. Если бы я это делал на F#, то мне пришлось бы гораздо труднее.

Ничего из этого не является dealbreaker'ом, впрочем. И теперь список того, что в F# лучше, чем в Scala.

  • Человеческие ADT. Это вообще must have!
  • Computation expressions. Несмотря на наркоманию с наличием одновременно Yield/Return, Bind/For и т. п. пар, которые делают ровно одно и то же, этот сахарок гораздо слаще for-comprehension в Scala.
  • Автокарринг. Без него бесточечный стиль применим гораздо реже, чем хотелось бы.
  • Типовыводилка. Тема спорная, но мне нравится типовыводилка из ML-ей.
  • Type providers. В Scala это реализуется макросами, но они до сих пор в экспериментальном статусе.
  • Code quotations. В Scala есть quasi-quotations и reify, но это добро вместе с макросами в экспериментальном статусе. Что-то сопоставимое появится только когда зарелизится Dotty.

Такие дела. А теперь давайте устроим высокоинтеллектуальный срач по теме в комментах!

★★★

Доступ к компилятору как к библиотеке.

Не специалист именно в F#, но C# можно встраивать используя возможности Mono и Roslyn. Это ни разу не просто, но возможно (и даже используется иногда).

А так, весьма интересное сравнение. Я как специалист по C#\Mono - всегда хотел покрутить ещё и F#. Меня останавливает только что компилятор и среда F# не входит в стандартную комплектацию Mono (подозреваю что и в .net, тоже) и каждый новый релиз F# собирается из исходников (и опакечивается) всё с большим количеством костылей.

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

Меня останавливает только что компилятор и среда F# не входит в стандартную комплектацию Mono (подозреваю что и в .net, тоже)

В .net core входит. dotnet new console --language F# работает из коробки.

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

.net core - пока ещё сам по себе тот ещё костыль. что-бы его только из исходников собрать под любой нестандартный дистр - надо помучатся.

DawnCaster ()

я вот пытаюсь потыкать палочкой Scala. и нифига не могу вывернуть свой ГМ выражаться в функциональном стиле.

ну хоть взять пример. есть сервер, есть API, а я должен реализовать клиентское API (библу). и вот не вяжется у меня с тем, что я должен все (по-максимуму) делать val-immutable.

пример: клиент захочет использовать мой класс. ок. а мой класс должен делать запросы на сервер (это ХТТП), указывать хедеры, получать обратно хедери и хранить их. и вот почему тут не взять и не использовать var переменную-то? или надо обязательно вкорячить какую-то одно-элементную хранилку а-ля List или Queue с максимальной длиной =1? вот не могу себя заставить это придумать.

как быть, господин скалист с 8-летним стажем? как это в скале принято делать?

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

и вот почему тут не взять и не использовать var переменную-то?

Отличный вопрос! Действительно, почему нет?

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

да я понимаю, что это самое простое, но не по-функциональщине :) может быть, есть более функциональное решение?

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

не по-функциональщине

За идеологию денег не платят. На то Scala и гибридный язык.

может быть, есть более функциональное решение?

Может и есть, от ситуации зависит. Если надо просто передать хедеры между вызовами, то можно параметрами передавать.

for {
  resp1 <- myWebApi.method1(predefinedHeaders)
  resp2 <- myWebApi.method2(resp1.headers)
} yield resp2.body
Zenom ★★★ ()
Ответ на: комментарий от siegment

Что уж там мелочиться; нужно сразу взять Agda или Lean.

Когда у них бэкенд нормальный запилят, тогда можно будет.

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

Не могу найти по ним практического полезного примера. Куда не гуглю - пруфы что 2+3 == 5 в форме Пеано. Это как хаскель - язык написания факториалов.

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

Причем с примером врямо в коде, мол «Вот стена текста на 5 страниц. Теперь вот это все импортируем. И в этой строчке получаем пруф что самолет не упадет»

vertexua ★★★☆☆ ()
Последнее исправление: vertexua (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

Какой бекенд? Компиляция? Agda давно компилируется и имеет прозрачный FFI с Haskell’ем; а Lean с четвёртой версии (но она ещё допиливается, к сожалению) компилируется в C++, к полученным файлам можно потом произвольный C++ прикомпилировать, «@[extern]» там есть.

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

Это как хаскель - язык написания факториалов.

Это как балалайка или пьяные медведи — стереотип.

«Type-Driven Development With Idris» почитай. Там по Idris’у, но никто не мешает использовать техники оттуда в любом языке с DT.

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

мой класс должен делать запросы на сервер (это ХТТП), указывать хедеры, получать обратно хедери и хранить их

Вся загвоздка в слове «хранить». Функциональные языки в частности нашли своё применение с свете популяризации stateless-бэкендов.

или надо обязательно вкорячить какую-то одно-элементную хранилку а-ля List или Queue с максимальной длиной =1?

State-монада есть во многих языках, насчёт скалы хз.

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

Ну я знаю что стереотип, но на поверхности у ФП этот злополучный пример, который не впечатляет. Не умеют люди продавать. Тоже самое и с theorem prover langs

vertexua ★★★☆☆ ()
Последнее исправление: vertexua (всего исправлений: 1)
Ответ на: комментарий от siegment

Agda давно компилируется и имеет прозрачный FFI с Haskell’ем

Только вот медленная, как и Idris.

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

Да открой репозитуарий HoTT, там вот полно пруфов любых сложностей.

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

Какой бекенд? Компиляция? Agda давно компилируется и имеет прозрачный FFI с Haskell’ем

Ну вот ты им пользовался сам?

Lean с четвёртой версии (но она ещё допиливается, к сожалению) компилируется в C++, к полученным файлам можно потом произвольный C++ прикомпилировать, «@[extern]» там есть.

«Компилируется в C++» — это вообще ничего о скорости не говорит, сам понимаешь.

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

Только вот медленная, как и Idris.

С этим, кстати, забавно вышло. У Idris 2 бэкенд в схему сделан, и Edwin говорит, что код быстрее чем из сишного бэкенда выходит. К вопросу о компиляции в C++.

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

Не умеют люди продавать.

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

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

Ну вот ты им пользовался сам?

У Агды — нет, у Lean 4 — да. Мне понравилось.

«Компилируется в C++» — это вообще ничего о скорости не говорит, сам понимаешь.

Не спорю; но, стоит отметить, что они обещают к релизу приличную скорость. За их слова отвечать не могу, конечно.

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

Я тут как-то раз спрашивал про cats и scalaz. Как мне пояснили, шкалка и так тормоз, а с ними всё вообще чуть ли не колом встаёт.

hateyoufeel ★★★★★ ()

Scala vs F#

На всякий случай: Обаму избрали на второй срок, после него президентом стал Дональд Трамп, а у нас Медведев уступил место Путину.

Будут еще вопросы — обращайся.

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

Также на всякий случай: Scala 2.13 вышла несколько недель назад. Среди прочего там запилили literal types, что ещё на шаг приближает её к языкам с зависимыми типами. F# 4.6 зарелизился в марте этого года.

Zenom ★★★ ()

если в OCaml это компенсируется мощной системой модулей

Вот все это повторяют. Что именно имеется ввиду? Я сам OCaml не знаю, но не могу понять, что делает где-то там модули мощными. Они ж везде простые как топор

vertexua ★★★☆☆ ()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)