Kirill
а вообще много уже рекомендовали, но ещё раз советую книжку Марлоу
Alexander
Всем привет. Часто слышу, что Хаскель хорош для написания EDSL-ей. На какие библиотеки нужно посмотреть, чтобы убедиться в этом высказывании?
eESL - это не про библиотеки, а про дизайн предметно-ориентированного кода. Вообще можно без каких-либо библиотек это делать.
Alexander
Однако здесь можно запользовать линзы и фри монады.
Vasiliy
eESL - это не про библиотеки, а про дизайн предметно-ориентированного кода. Вообще можно без каких-либо библиотек это делать.
я имел ввиду, что кто-то наверняка своял библиотеки, интерфейс которых выглядит как отдельный мини-язык
Vasiliy
Англоязычные Хаскелисты подкинули такой список: SBV diagrams pandoc? accelerate blaze esqueleto shake lens? gloss
кана
линзы
Aleksei (astynax)
Если отдельный, то это не eDLS
eahqzsr
Prelude> :t Just . Just Just . Just :: a -> Maybe (Maybe a) Prelude> :t \f -> f . f $ Just \f -> f . f $ Just :: ((a -> Maybe a) -> a -> Maybe a) -> a -> Maybe a Почему так?
Aleksei (astynax)
доллар в лямбду попал
Aleksei (astynax)
скобки вокруг лямбды нужны
Vasiliy
Любая библиотека является eDSL до некоторой степени
Тем не менее некоторые можно показать даже не Хаскелисту со словами "смотри, как у нас можно", а другие стыдно самому смотреть. Мне хотелось посмотреть на идеоматичный хаскель код на примере которого можно научится каким-то применимым в жизни подходам. Но, в принципе, я уже нашёл всё что хотел )
Vasiliy
Ну и, собвственно, "Хаскель крут для EDSL-ей" звучит круто, на на деле докопаться почему не так уже просто
кана
Prelude> :t Just . Just Just . Just :: a -> Maybe (Maybe a) Prelude> :t \f -> f . f $ Just \f -> f . f $ Just :: ((a -> Maybe a) -> a -> Maybe a) -> a -> Maybe a Почему так?
ты применяешь Just к f получется f уже принимает (a -> Maybe a) -> b потом ты применяешь f к f, получается, что и отдает f то же, что и на входе: (a -> Maybe a) -> (a -> Maybe a)
eahqzsr
скобки вокруг лямбды нужны
Да, точно. Тогда так Prelude> :t (\f -> f . f) Just <interactive>:1:15: error: • Occurs check: cannot construct the infinite type: b ~ Maybe b Expected type: b -> b Actual type: b -> Maybe b • In the first argument of ‘\ f -> f . f’, namely ‘Just’ In the expression: (\ f -> f . f) Just
Aleksei (astynax)
Тут уже всё нормально. См. тип лямбды до применения
Aleksei (astynax)
Aleksei (astynax)
Линзы тоже можно считать eDSL, ок
Alexander
У Сервана часть, ответственная за описание API, самый что ни на есть eDSL, на типах.
Aleksei (astynax)
Это просто инфиксные конструкторы же
Aleksei (astynax)
Впрочем нужно просто определиться с терминологией применительно к Хаскель :)
Alexander
Это может быть чем угодно, если оно выражает предметную область, причем без лишних конструкций
Aleksei (astynax)
Если есть набор комбинаторов и функций, предназначенных для решения одной задачи, то это eDSL
Aleksei (astynax)
Если комбинаторы обобщённые, то не DSL.
Aleksei (astynax)
Аппликативно-монадные операторы не дают eDSL, например
Alexander
Мое понимание eDSL шире.
кана
но можно принимать полиморфные функции
кана
double :: forall a f . (forall x. x -> f x) -> (a -> f (f a)) double f = f . f
Евгений
По-моему edsl это какое-то слово без смысла
Aleksei (astynax)
<*> - это не "язык в языке". foo # color ~ "red" (или как там в диаграммах?) - вполне себе
Евгений
А персистент это edsl?
Aleksei (astynax)
Там есть "набор комбинаторов, пригодных только для решения конкретной задачи"? А то я не помню уже
Aleksei (astynax)
Квазиквоты postgresql-query, например, это не eDSL. Это настоящий внешний DSL
Евгений
Ну, для конструирования условий SQL есть комбинаторы
eahqzsr
Тут уже всё нормально. См. тип лямбды до применения
Ага, т.е. Just . Just работает так как Just полиморфный?
Aleksei (astynax)
Можно просто "eDSL" в контексте хаскеля заменять на "библиотека комбинаторов"
кана
нельзя не эндоморфизм скомпозить с собой
имею в виду, что в Just . Just тут два разных just, так как конструктор полиморфен по своему аргументу. первый Just @a :: a -> Maybe a второй уже Just @(Maybe a) :: Maybe a -> Maybe (Maybe a) нужно задать эту квантификацию фручную, хаскель не выводит
Aleksei (astynax)
Aleksei (astynax)
типа того
Aleksei (astynax)
А то Control.Applicative ещё чего доброго eDSL назовут :)
Aleksei (astynax)
"DS" и обозначает как раз ограниченность применимости
Евгений
Но просто в случае всяких комбинаторов, которые генерят sql, graphviz или css -- понятно, там есть внешний язык, для которого всё конструируется. А можно примеры, где такого языка нет?
кана
тогда нельзя ли сказать, что Applicative - DSL для работы со значением и эффектами без цепочки последовательных операций?
Aleksei (astynax)
Да стрелки по всему коду размазаны хотя бы виде &&& и ***
Aleksei (astynax)
Какой то домайн неспецифик язык
кана
то есть как мы определяем edsl для работы с базой, не зная, что внутри там происходит (через тайпклассы или фри монады), так и applicative, ведь мы тоже не знаем, что там происходит (с неизвестным аппликативом)
Aleksei (astynax)
Поэтому давайте вообще этот термин не будем прмименять :) У нас комбинаторы есть
кана
тут еще дело в нейминге, pure - вполне себе дсльный нейминг, когда мы используем не глагол, но описание результата class EffectsDSL m where pure :: a -> m a apply :: m (a -> b) -> m a -> m b apply (apply (pure (+)) (pure 10)) (pure 20) в общем, я вполне уверенно считаю и считал аппликативы edsl, и даже тут как-то такое обсуждали в контексте pure
Евгений
@astynax, мне кажется, что твоё "определение" опирается на философскую разницу между общим и всеообщим. А она очень нетривиальна и спекулятивна
Aleksei (astynax)
моё определение не лучше и не хуже :)
Aleksei (astynax)
предлагайте свои варианты
Cheese
я имел ввиду, что кто-то наверняка своял библиотеки, интерфейс которых выглядит как отдельный мини-язык
Control.Applicative и Control.Monad, правда, нужно время, чтобы понять, как они работают в роли универсального интерфейса
Alexander
Простите, забыл о его существовании 😊
Евгений
А что щас модно для record-relations mapping в сабже юзать? Я по привычке окунулся в персистент, но НЯП это не авангардно сейчас
Alexander
Опечатка конечно
Aleksei (astynax)
embedded embedded-specific language
Aleksei (astynax)
вполне себе
Aleksei (astynax)
Встроенный язычок для кодинга под эмбед
Aleksei (astynax)
eHDL ещё
Aliester
масло масляное
Aliester
eDHL
eahqzsr
масло масляное
скорее масло . масло
Aleksei (astynax)
Не, один embedded, это "встроенный (в хост-язык)", второй embedded - "для встраиваемых систем" же
eahqzsr
ну полиморфизм же
Aleksei (astynax)
перегруженный термин
Aleksei (astynax)
Вот вам eESL, а вот eHDL (от Зефирова, конечно же)
Алексей ayaye :)
тут еще дело в нейминге, pure - вполне себе дсльный нейминг, когда мы используем не глагол, но описание результата class EffectsDSL m where pure :: a -> m a apply :: m (a -> b) -> m a -> m b apply (apply (pure (+)) (pure 10)) (pure 20) в общем, я вполне уверенно считаю и считал аппликативы edsl, и даже тут как-то такое обсуждали в контексте pure
а мне иногда кажется, что это должно быть какими-то потрохами, которые должны допускать использование без понимания деталей происходящего. как аналогия - при изучении виртуальных функций в С++ не обязательно знать про таблицы виртуальных функций и другие детали реализации.
кана
Ну так а аппликатив что делает?
Алексей ayaye :)
я к тому, что зачем-то объясняют кухню, а потом жалуются, что порог вхождения высок
Алексей ayaye :)
это ж всё равно что объяснять устройство плюсового компилятора перед тем как допустить к программированию на плюсах