kosc
Ну я пока смог найти то, что трансформеры нужны, что бы внутри одной монады обеспечивать эффект другой.
kosc
Правильно я понял или нет?
Dmitry
Да
kosc
А так только 2 монады можно друг в друга вложить?
Dmitry
Не, можно больше, но сложности взаимодействия монад часто сильно возрастают.
Dmitry
Если очень грубо: вот у тебя есть N монад, ты добавляешь ещё одну. Надо организовать взаимодействие с N монадами. Не всегда это автоматически удаётся сделать.
Dmitry
Но это если грубо.
kosc
А, ну примерно вроде понял.
kosc
Надо погонять 2-3 примерчика, и поверхностное понимание сложится. А дальше по идее должно быть проще.
Dmitry
https://ru.wikibooks.org/wiki/Haskell/Monad_transformers
Dmitry
Во что есть!
Maxim
М, сендвичи
kosc
Dmitry
Курс на Степике попробуй, он годный. Можно сразу со второго.
kosc
Он бесплатный?
kosc
А то я пока бомжую.
kosc
Да и Haskell у меня как хобби, а не как профессия.
Dmitry
Бесплатный.
Aleksei (astynax)
Монадки вкладывать можно и без трансформеров. Но придётся руками обеспечивать "перенос эффекта". А с трансформерами нужно просто лифтить нужное кол-во раз :)
Aleksei (astynax)
Кол-во уровней вложенности будет влиять только на кол-во вызовов lift для доступа к конкретному слою. Если взять подход mtl, то можно не лифтить руками при условии, что слои будут разные
Алексей
Еще можно написать инстансы (Functor f, Functor g) => Functor (Compose f) и такой же для аппликатива. И разобраться почему нельзя написать такой же для монад
Зигохистоморфный
базовые монадки даже можно менять довольно general
kosc
kosc
А есть всякие liftMaybe и так далее?
Зигохистоморфный
Зигохистоморфный
это обобщение всех случаев
Зигохистоморфный
@hotkosc держи, тут step by step
https://two-wrongs.com/a-gentle-introduction-to-monad-transformers
kosc
О, спасибо!
Aleksei (astynax)
Aleksei (astynax)
IO - особенная монадка. Если она есть в стеке, то всегда в конце
Зигохистоморфный
IO всегда должен быть на самом нижнем уровне в трансформерах
Aleksei (astynax)
Потому как IO нельзя "распаковать и потом запаковать"
Aleksei (astynax)
Поэтому не получится "сквозь IO" лифтить
Зигохистоморфный
нет такого понятния как IOT (хотя хз, можно unsafePerform но это зло)
Aleksei (astynax)
unsafePerformIO выполняет IO, а lift - не "выполняет" поднимаемый action. Так что unsafePerformIO в принципе не подходит :)
Алексей
Можно написать. Но придётся нарваться на всякие неприятные сюрпризы
kosc
data ParsecT s u m a
А что вот в доках Parsec озаначает вот этот трансформер? Он одну в другую монаду заворачивает или там их больше?
kosc
Ну и в чём суть, а то я из доков не понял.
Dmitry
s u m a - это параметры типа.
kosc
Ну вот да, то есть каждый из них - суть отдельная монада?
Dmitry
Суффикс T говорит, что это ParsecT - это трансформер, т.е. его можно надеть на другую монаду.
kosc
Всмысле, параметр для понаты.
kosc
Dmitry
Монада задаётся предпоследним параметром m, как правило.
Dmitry
Ну вот там даже ниже есть пример для монады Identity:
Dmitry
type Parsec s u = ParsecT s u Identity
Dmitry
Ну и в самом начале: ParsecT s u m a is a parser with stream type s, user state type u, underlying monad m and return type a.
kosc
Блин, пока чёт сложна.
kosc
Видимо, рано я полез Parsec курить.
Dmitry
На Степике есть упражнение по написанию своего парсера, если чо ;)
kosc
Круто!
Dmitry
А вообще, полезно разобраться с монадой State, тогда Парсек просто понять.
Зигохистоморфный
Dmitrii
На случай, если кто-то пропустил туториал по Backpack на примере реализации интерфейса для контейнеров.
Dmitrii
New blog post about Backpack implementation for containers interfaces in Haskell
• https://kowainik.github.io/posts/2018-08-19-picnic-put-containers-into-a-backpack
кана
кана
сработала только с траверсаблом, потом что в бинде все равно нужно распаковывать
Kirill
конструктор просто просит чтоб перед ним id поставили...
Alex
Джентельмены, а почему кабал жалуется на табы? Скажите пожалуйста, где можно изменить настройку индентов
Cheese
Alex
Это да, но я бы хотел юзать табы вместо спейсов
Cheese
в кабалфайле?
Alex
Я не могу нагуглить, как там дать такую инструкцию
Dmitry
-fno-warn-tabs ?
Cheese
в языке, чувствительном к отступам, лучше не использовать табы
Alex
Ладно, я думаю это не страшно, спейсы так спейсы. Только зачем так жестко сеттить, что при использование таба в кабал файле для индента он перестает билдить
Alex
Мне ужас как неуднобно. В С++ коде у меня табы, в хаскеле спейсы и там и там я использую ВСкод.
Alex
Наверно нужно гуглить как сеттить настройки для расширений файлов
Alex
Не заставило себя долго ждать
Alex
Есть вот такая штука
Alex
"editor.detectIndentation": true
кана
ну или просто перейти везде на спейсы
кана
"[haskell]": {
"editor.tabSize": 4
},
Cheese
Alex
undefined
Dmitry
Dmitry
Непереносимо :(