LINUX.ORG.RU

Haskell для JVM?!

 , , , ,


0

5

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

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

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

★★★★★

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

Продолжаю не понимать.

Ты заявил, что for-компрехеншены не поддерживают циклы. Теперь я пытаюсь выяснить, что это означает. В контексте ФП. Ты мне сам показываешь, что цикл — это просто функция (кстати, она у тебя неправильно написана; но это мелочи). for-ы не поддерживают функции?

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

Ну вот ты и ответил. ЧСХ, твоя сигнатура читабельнее в разы.

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

Вполне вероятно, что так оно и будет, отдашь какому-нибудь ушлому урке, если не прекратишь бросаться необоснованными утверждениями.

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

Ну, не знаю как тогда объяснить. Да, цикл преобразуется в функцию. В этом вся соль, но выглядит это в коде как обычный while, где внутри могут быть монадические стрелки. Синтаксический сахар.

Точно такое же проделывается и с прочими конструкциями языка: if (ветвление, а не фильтр), for (цикл, а не comprehension), match, try finally, try with (try catch). Очень удобно.

Возвращаясь к нашим баранам, с for-comprehension будет выглядеть некрасиво. Синтаксис имеет значение. Вопрос о синтаксисе, эстетике и о том, насколько удобно использовать, а написать можно и на Java или C#.

А что не так с функцией whileM? Проверил. Все компилируется.

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

А, понял:

import Control.Monad

whileM :: Monad m => m Bool -> m () -> m ()
whileM p m =
  do x <- p
     when x $
       m >> whileM p m
dave ★★★★★
() автор топика
Последнее исправление: dave (всего исправлений: 1)
Ответ на: комментарий от dave

То есть, ты не можешь обосновать свое утверждение? OK, все что я хотел услышать, я услышал, исчезаю.

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

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

Кстати, вспомнилось. Есть интересные слайды «GHC's Garbage Collector». Особо не вчитывался, по похоже, что иммутабельность действительно учитывается в хаскелевском сборщике мусора. Еще она, конечно, учитывается в том, как поддерживается многопоточность.

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

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

с её убогой моделью памяти

В хаскеле модель памяти еще более убога.

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

Особо не вчитывался, по похоже, что иммутабельность действительно учитывается в хаскелевском сборщике мусора.

Ага, в некотором смысле. А именно: там просто нет для него работы. Если у нас нет изменений связей ссылок и объектов, ничего убирать собственно и не надо, все остается висеть в памяти. Зачем вообще в подобных ЯП сборщик мусора, не совсем понятно.

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

Еще она, конечно, учитывается в том, как поддерживается многопоточность.

Ты кстати, правильный термин выбрал, в ФП многопоточность может быть только поддержана (но не реализована). А роль тут следующая. Пусь у нас есть вычисление f(f1 f2). если мы знаем, что вычисление f1 не шарит память с f2, либо шарит, но не изменяет, то мы можем очень просто вычислить f1 и f2 в разных потоках

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