LINUX.ORG.RU

Haskell для JVM?!

 , , , ,


0

5

Предыстория. Написав более мегабайта кода на Scala, фактически в стол, для себя я решил, что Scala - не мой язык, хотя он и становится популярным. Лакмусовой бумажкой для меня служит то, что в Scala до сих пор нет адекватного сахарка для монад. Есть несколько вариаций, но ни одной полноценной с моей пристрастной точки зрения. Последнее, что видел из интересного, это плагин effectful, но спрашивается, какого черта они требуют зависимость от scalaz, что на мой взгляд губит на корню всю идею! В общем, Scala уже давно не вызывает прежнего восторга, который определенно был, когда я зачитывался книгой Одерского и компании. Для себя я уже все решил относительно Scala. Но иногда так хочется полноценного статически типизированного ФП на JVM…

И тут сегодня обнаружил прелюбопытную для себя вещь. Называется Frege. Позиционируется как чистый функциональный язык программирования для JVM в духе Haskell. И действительно, выглядит очень похоже. Немного расстраивает отсутствие MonadFix и рекурсивной нотации do, но я надеюсь, что они добавят эти вещи в скором будущем.

Что думает народ по этому поводу? Прошу высказываться.

★★★★★

Последнее исправление: CYB3R (всего исправлений: 1)

Написав более мегабайта кода на Scala, фактически в стол

месье знает толк в извращениях

до сих пор нет адекватного сахарка

нафига тебе «сахарок»??

PS и если ты столько кода не заленился родить - взял бы и наваял себе сахарка

shty ★★★★★
()
Последнее исправление: shty (всего исправлений: 1)

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

stevejobs ★★★★☆
()

Чего такого нет у GHC и GHCi, чтобы понадобился JVM? «Не преумножайте сущности без надобности». От себя добавлю, что сообщество определяет язык, и мертв тот язык, вокруг которого не сложилось определенное сообщество. Думаю, у Frege так и есть, и все говно придется разгребать самому.

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

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

with(new Monad){calculation here}

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

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

Legioner ★★★★★
()

F#

А монады и на JS можно

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

with(new Monad){calculation here}

Ты всё опять неправильно понял.

mix_mix ★★★★★
()

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

foror ★★★★★
()

Лакмусовой бумажкой для меня служит то, что в Scala до сих пор нет адекватного сахарка для монад.

Какого конкретно сахарка не хватает?

Zenom ★★★
()

Можно подумать, будто без зависимости от scalaz на скалке можно написать что-то нужное.

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

Сравниваю с тем, что позволяют вычислительные выражения F#. И они не только для монад. Кстати, отличный язык. Жаль, что не такой популярный как Scala.

В Scala есть плагин продолжений. Если бы этот плагин преобразовывал код не только в контексте продолжений, но и умел делать это для любых других монад (да, монадический bind можно запихнуть в shift, но это серьезный overhead и жутко неудобно), то это было бы ближе к желаемому.

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

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

JVM - это винда, мак и линукс. Еще это Swing и SWT для GUI. Меня интересует все это. Сама Java - не особо.

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

Сравниваю с тем, что позволяют вычислительные выражения F#

Давно хочу посмотреть F#, да всё руки не доходят.

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

clojure - это хорошее и добротное ФП безусловно, но typed?.. сильно смущает динамическая природа лиспа.

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

Какого конкретно сахарка не хватает?

адекватного сахарка


Ваш К.О.

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

Да тут половина ЛОРа бредит ЯП, который любую задачу решает парой операторов, скомбинированных должным образом. И на любой язык, который данным свойством не обладает, смотрят как на говно, а на программистов на нем - как на быдло.

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

Вот и я о том же: числами «от фонаря» здесь лучше не оперировать — загрызёть местное зверье за такие оплошности, чистая гопота, ну :)

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

Ну я не говорил только о двух половинах, если что. А гопота - да, это правильное название для такой публики.

asaw ★★★★★
()

А чем for-компрехеншены не нравятся? Чуть по-другому, но, в принципе, та же чухня.

И как можно жить в Scala без Scalaz?

То есть, я согласен, что, по сравнению с хаскелем, scala откровенное говно, но... по сравнению со всем остальным это почти что хаскель.

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

Но когда чувак страдает от несовершенства любого из популярных ЯП...

Почему ты считаешь это удивительным?

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

For-comprehension годится разве что только для hello world.

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

Еще бывают нужны циклы. Обычные циклы for и while, но внутри вычисления. В for-comprehension нет удобного решения.

Не продумано.

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

Чего такого нет у GHC и GHCi, чтобы понадобился JVM? «Не преумножайте сущности без надобности». От себя добавлю, что сообщество определяет язык, и мертв тот язык, вокруг которого не сложилось определенное сообщество. Думаю, у Frege так и есть, и все говно придется разгребать самому.

Особенно меня интересует ГУИ. Например, есть ли смысл связываться с wxHaskell?

Frege, как понимаю, должен позволять использовать Swing / SWT (или даже тот упоминаемый мною код на Scala, что у меня использует SWT).

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

Сахарком и отличается, тем самым, по которому ТС плачет.

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

Принимай таблетки и не ходи на лор, шизофреник ничтожный. Ты опять ни хера не понял.

anonymous
()

кстати, что не так со scalaz?

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

For-comprehension годится разве что только для hello world.

Ты прям открыл мне глаза. Завтра всем своим коллегам расскажу, а то они до сих пор for-ы пишут.

Приведи примеры того, что ты говоришь — потому что пока что это совершенно непонятно.

Miguel ★★★★★
()

Какой смысл в борьбе за чистоту и иммутабельность, если всё это всё равно вертится в JVM с её убогой моделью памяти, а сборщики мусора клали болт на все эти достижения?

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

Я же все написал выше. Может быть, слишком кратко. Хорошо, попытаюсь немного разжевать.

Есть вычисление Process. Есть ресурс. Захват ресурса моделируется вычислением Process[Unit], т.е. действием в рамках вычисления, которое совершает побочный эффект.

Если мы хотим вовлечь это действие в for-comrehension, то нужно использовать, как минимум, искусственную переменную или _ для Unit. Уродливо? Безусловно.

Теперь представим, что подобные действия совершаются часто, весь код усыпан ими. Насколько хреново тогда будет выглядеть for-comprehension? Просто безобразно будет выглядеть. Неэстетично.

Идем дальше. В этих вычислениях полно циклов и условных переходов. Понимаю, что while / for / match / if внутри вычисления - это всего лишь сахар, но писать это через for-comprehension? Нет, уж, увольте.

В общем, for-comprehension - это как-то несерьезно даже. Для простых случаев годится. Для описания сложной логики в рамках вычисления - очевидно, что нет.

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

Здесь заметим, что будь в Scala что-то похожее на вычислительные выражения F#, то, скорее всего, и не было бы никакой надобности писать какой-то там еще плагин. Плагин продолжений для Scala - тоже.

Кстати, вычислительные выражения F# - во многом побочный продукт от введения в F# асинхронных вычислений. Понадобился удобный синтаксический сахар для монады Async. Дон Сайм поступил мудро - он предложил общее решение, которое годится и для других монад, и не только монад, но даже последовательностей, потоков и т.п. Ну, я уже писал, что F# - очень интересный язык.

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

А причем здесь это? Просто разные уровни абстракции. Haskell тоже компилируется в натив. Побочные эффекты, кстати, в Haskell есть.

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

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

Как правило, удобство языка это перекрывает.

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

Ага, когда на скале пытаются написать SKI, это превращается в такие танцы с типами :( В то время, как на лиспе с этим попроще. Ну, тут просто дело в рекурсивных типах.

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

Если твоя претензия к скалази - это синтаксис, то поздравляю, ты ничего не понял.

Не удивлюсь, кстати, если ты еще любишь ныть про названия функций и однобуквенные переменные.

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

Если мы хотим вовлечь это действие в for-comrehension, то нужно использовать, как минимум, искусственную переменную или _ для Unit. Уродливо? Безусловно.

Понял. Но это, ИМХО, мелкая фигня.

В этих вычислениях полно циклов и условных переходов. Понимаю, что while / for / match / if внутри вычисления - это всего лишь сахар, но писать это через for-comprehension?

А вот это я по-прежнему не понимаю. Для начала: какие циклы, если мы делаем ФП?

Задумайся, зачем оба раза написали такой плагин?

Понятия не имею. Никогда с этим плагином не сталкивался.

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

Конкретно чистота и иммутабельность - необходимые условия ссылочной прозрачности

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

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

Да, только человек этот особенный. Обычным людям женщин для этого дела хватает.

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

У меня лично нет претензий, я поддержал мнение, что там слишком много эзотерики. Ну и тебя никто не хочет удивить, дружок. Назвать функцию f, если ты ее суешь в ФВП - нормально.

Я об этом: https://github.com/scalaz/scalaz/blob/4fa9d9fce7cec05c85c3e99a707c47ed9d0e6b0...

Давай, прочитай сигнатуру и определение и скажи, что это все.

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

Ну, он типа лошок, он про CoW никогда не слышал. Вот и дрочит на свою иммутабельность.

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

Жаль, что не такой популярный как Scala.

Интересно.
Я лично о Скала только слухи об использовании слышал и меня на интервью пару раз вызывали изз того что у меня сертификаты с курсеры в резюме а агенту сказали найти именно со скалой, но в конторе скалу никто не использует.

А вот F# в финансах(видел у трэйдеров) используют

grim ★★☆☆
()
Последнее исправление: grim (всего исправлений: 2)
Ответ на: комментарий от cdshines

Если бы скала не была говном, то сигнатура выглядела бы следующим образом:

contra3_4 : (c <~< z) -> (t a b z d <~< t a b c d)

`contra` - контравариантный функтор. `3` - порядковый номер параметра T, `4` - число параметров у T. Про Liskov substitution написано в википедии. Определение читать не нужно, потому оно единственное и выводится из сигнатуры очевидным образом.

В общем, всем, кто не из деревни, тут все понятно. Иди книжки читай.

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

В этих вычислениях полно циклов и условных переходов. Понимаю, что while / for / match / if внутри вычисления - это всего лишь сахар, но писать это через for-comprehension?

А вот это я по-прежнему не понимаю. Для начала: какие циклы, если мы делаем ФП?

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

Возьмем плагин продолжений в Scala. Он умеет преобразовывать конструкцию while. Если на хаскеле, то получается что-то вроде такого

whileM :: Monad m => m Bool -> m () -> m ()
whileM p m =
  do x <- p
     when x $ whileM p m

В случае менее чистых F# и Scala предикат идет как обычная функция Unit -> Bool, а потому используется стандартная запись, но внутри вычисления:

while (p) { m }

Выражение m может содержать монадические стрелки.

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