Alexander
На PureScritp'е мы сейчас Web UI делаем с помощью портированного нашим коллегой reflex-dom: https://github.com/restaumatic/purescript-specular
Зигохистоморфный
хм
Зигохистоморфный
а зачем портировать рефлекс если есть почти такой же purescript-behaviors?
Alexander
Это лучше у коллеги спросить. Может, ему не хватало самовыражения.
Влод
а вот например в halogen тоже вроде поначалу сигналы были и всякое фрп. в 0.4 вроде чому они отказались?
Dmitry
нормально собираться и собирать проекты
Dmitry
ставиться из каких-то источников
Dmitry
нормальных.
Dmitry
находиться под активной разработкой, работать над компактизацией кода и оптимизацией
Зигохистоморфный
нормально собираться и собирать проекты
так он собирается и юзается 8 ghc
Dmitry
web assembly ?
Dmitry
я что-то не уверен насчёт "нормально", у нас сборка одного проекта даже с никсом занимает часов пять
Зигохистоморфный
web assembly ?
так ghcjs и так собирает некую стейт машину что работает быстро
Dmitry
и от этого возникает сильнейшее недовольство заказчика, например
A64m
нормально собираться и собирать проекты
ну над этим какие-то люди вокруг рефлекса работают
Dmitry
короче всё это не выглядит, как что-то надежное / годное, а выглядит как маргинальное ответвление, это если еще сам ghc не считать чем-то маргинальным
Alexander
не шляпа конечно, но и не панацея
Free монады - очень нужная концепция. Free-монадические языки решают ту же проблему, которую решают ООПшные интерфейсы, но в чисто функциональном стиле. Проблема называется коротко: Inversion of Control. Free-монады можно использовать в друх вариантах: - scenario-oriented eDSL - API-oriented eDSL Scenario-oriented eDSLs - это такие языки, на которых вы пишете бизнес-логику. Выражают предметную область, процессы и данные в ней. Такой DSL обычно спроектирован так, чтобы его методы были композабельные. API-oriented eDSL - это интерфейс к подсистеме. Композабельности методов относительно друг друга не требует, может представлять просто набор методов, абстрагирующих сервис.
Dmitry
когда я их смотрел, то столкнулся с проблемой уже на уровне реализации ветвлений
A64m
находиться под активной разработкой, работать над компактизацией кода и оптимизацией
активность автора плохо отслеживается, он годами что-то себе коммитит в стол, а потом, внезапно, бабах в репе новая ветка. Так что точно сказать нельзя, но он какое-то время назад работал над новым бекендом, продолжает ли он и сейчас или все уже сдохло неизвестно
Dmitry
вот именно это и напрягает
A64m
компиляция в вебасембли, может быть, ghcjs со временем убьет, но по-моему, и само будущее вебасембли под вопросом
Dmitry
с тем, что было неочевидно, как делать ветвления в сценариях.
Alexander
Ну просто if или case
Dmitry
если где-то есть пример - я бы взглянул. вроде бы очевидная вещь, если мы говорим про dsl
Alexander
У меня есть кой-какие примеры, да
Dmitry
доступны что бы посмотреть?
Dmitry
ну опять же, можно спросить например @qnikst почему они у себя не используют фри монады, а используют подход, о котром он рассказывал
Alexander
с тем, что было неочевидно, как делать ветвления в сценариях.
Если не хочется этот DSL сериализовать, то все конструкции языка валидны: myScenario :: Int -> Free MyDsl Int myScenario i = case i of 1 -> return 2 2 -> return 10 _ -> return i
Dmitry
хм, пожалуй, я бы посмотрел на какие-то более полные примеры и в контексте
Dmitry
может быть, уже есть более лучшие статьи по фримонадам, чем были год - два назад
Alexander
доступны что бы посмотреть?
Да, у меня же для этого целый showcase проект есть (сопровождает книгу): https://github.com/graninas/Andromeda/blob/master/test/Test/ControlProgramSpec.hs
Dmitry
что-то тут какое-то недопонимание.
Dmitry
явно.
Alexander
Поясните тогда
Dmitry
ну это надо найти статью, где описывалось применение
Denis
мне кажется тут про разное
Dmitry
@qnikst рассказывал, как они композят разные системы - это вот реализация явных API
Dmitry
будем считать, что я ничего не знаю про них - это почти правда, я посмотрел, попробовал использорвать и забыл - и пытаюсь их адаптировать.
Alexander
Есть еще более продвинутый вариант - freer-монады. Мы их как раз сейчас в проекте используем.
Dmitry
т.е что решают, как решают, почему это лучше, чем решение без них
Dmitry
т.е то, о чем была статья - это просто реализация некоего Dsl, интерпретация которого могла меняться в зависимости от.
Dmitry
не слишком впечатляло
Denis
do-нотация из коробки, параметризуется функтором.
Denis
я тоже не пользуюсь, кстати
Dmitry
ну вот, допустим
Leonid 🦇
в 95% случаев mtl-style заруливает фримонады
Dmitry
нам нужно сделать некую нотацию, которая бы в зависимости от ситуации либо генерировала бы некий парсер, либо, наоборот, генератор
Dmitry
чего-то, что этот парсер должен уметь парсить
Dmitry
довольно типичная задача, вроде бы.
Alexander
т.е то, о чем была статья - это просто реализация некоего Dsl, интерпретация которого могла меняться в зависимости от.
Да, но это не единственное преимущество. Можно инжектить зависимости, подменять имплементацию, использовать все монадические инструменты, тестировать. И при этом сам сценарий является чистым. Разделение: отдельно предметная область и сценарии, не имеющие эффектов, и одтельно интерпретаторы для разных окружений с эффектами. Ну то есть, интерфейс и реализация
Dmitry
ну ок, есть какие-то короткие примеры, которые показывают, как работает этот подход?
Leonid 🦇
я думаю тут только фри аппликативы могут
Вру, нужны моноеды и Control.Category. Я напиливал такое как-то. Ну и есть boomerang
Dmitry
ну т.е прошу понять правильно - это все звучит очень похоже на просто dsl и просто его интерпретатор
Dmitry
и его монадический билдер
Alexander
ну ок, есть какие-то короткие примеры, которые показывают, как работает этот подход?
Я не знаю, короткие там или нет, но позвольте поделиться своим материалом. Я там стараюсь хорошо разложить по полочкам, что и для чего. https://drive.google.com/drive/folders/0B1Rdr1fbS6M9SjlKUk1zMVNjOVU
Alexander
чем оно лучше mtl?
mtl захламляет код. А с Free-монадическим языком у вас, по сути, есть только предметная область.
Leonid 🦇
mtl захламляет код обоснуйте
Alexander
Ну и mtl-style не интерпретируемый
Leonid 🦇
Напиши другой инстанс - будет другой интерпретатор
Зигохистоморфный
Leonid 🦇
подменяй как хочешь
Влод
алсо хотелось бы услышать пример разных окружений в которых один и тот же код для dsl уместен
Alexander
ещё mtl вроде не занимается подменной имплементации
Есть паттерн, при котором можно инжектить зависимости, на самом деле. State monad injection, либо через тайпклассы
Dmitry
@vlastachu +1
Влод
да
Alexander
В freer-языках мокать более нижние слои легко.
Влод
я про это и подумал
Alexander
Ну и окей, у меня есть еще один пример