Kirill
а вообще много уже рекомендовали, но ещё раз советую книжку Марлоу
Alexander
Alexander
Однако здесь можно запользовать линзы и фри монады.
Vasiliy
Vasiliy
Англоязычные Хаскелисты подкинули такой список: SBV diagrams pandoc? accelerate blaze esqueleto shake lens? gloss
кана
линзы
Aleksei (astynax)
Если отдельный, то это не eDLS
Alexander
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-ей" звучит круто, на на деле докопаться почему не так уже просто
кана
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)
Тут уже всё нормально. См. тип лямбды до применения
Alexander
Alexander
Alexander
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 есть комбинаторы
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)
предлагайте свои варианты
кана
Ilya
Alexander
Простите, забыл о его существовании 😊
Евгений
А что щас модно для record-relations mapping в сабже юзать?
Я по привычке окунулся в персистент, но НЯП это не авангардно сейчас
Алексей ayaye :)
Alexander
Опечатка конечно
Aleksei (astynax)
embedded embedded-specific language
Aleksei (astynax)
вполне себе
Aleksei (astynax)
Встроенный язычок для кодинга под эмбед
Aleksei (astynax)
eHDL ещё
Aliester
масло масляное
Aliester
eDHL
Aleksei (astynax)
Не, один embedded, это "встроенный (в хост-язык)", второй embedded - "для встраиваемых систем" же
eahqzsr
ну полиморфизм же
Aleksei (astynax)
перегруженный термин
Aleksei (astynax)
Вот вам eESL, а вот eHDL (от Зефирова, конечно же)
Алексей ayaye :)
кана
Ну так а аппликатив что делает?
Алексей ayaye :)
я к тому, что зачем-то объясняют кухню, а потом жалуются, что порог вхождения высок
Алексей ayaye :)
это ж всё равно что объяснять устройство плюсового компилятора перед тем как допустить к программированию на плюсах
湊崎