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
https://ru.wikibooks.org/wiki/Haskell/Monad_transformers
Ага, спс, сейчас как раз туда гляжу.
Dmitry
Курс на Степике попробуй, он годный. Можно сразу со второго.
kosc
Он бесплатный?
kosc
А то я пока бомжую.
kosc
Да и Haskell у меня как хобби, а не как профессия.
Dmitry
Бесплатный.
Aleksei (astynax)
Монадки вкладывать можно и без трансформеров. Но придётся руками обеспечивать "перенос эффекта". А с трансформерами нужно просто лифтить нужное кол-во раз :)
Aleksei (astynax)
Кол-во уровней вложенности будет влиять только на кол-во вызовов lift для доступа к конкретному слою. Если взять подход mtl, то можно не лифтить руками при условии, что слои будут разные
Dmitry
Да и Haskell у меня как хобби, а не как профессия.
Ну если ты уже до монадных трансформеров дошёл, то курс нормально проведёт дальше по миру Haskell :)
Алексей
Еще можно написать инстансы (Functor f, Functor g) => Functor (Compose f) и такой же для аппликатива. И разобраться почему нельзя написать такой же для монад
Зигохистоморфный
базовые монадки даже можно менять довольно general
kosc
А есть всякие liftMaybe и так далее?
Зигохистоморфный
А есть всякие liftMaybe и так далее?
есть просто lift из MonadTrans
Зигохистоморфный
это обобщение всех случаев
Зигохистоморфный
@hotkosc держи, тут step by step https://two-wrongs.com/a-gentle-introduction-to-monad-transformers
kosc
О, спасибо!
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
Всмысле, параметр для понаты.
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
Джентельмены, а почему кабал жалуется на табы? Скажите пожалуйста, где можно изменить настройку индентов
Alex
Это да, но я бы хотел юзать табы вместо спейсов
Cheese
в кабалфайле?
Alex
Я не могу нагуглить, как там дать такую инструкцию
Dmitry
-fno-warn-tabs ?
Cheese
в языке, чувствительном к отступам, лучше не использовать табы
Alex
Ладно, я думаю это не страшно, спейсы так спейсы. Только зачем так жестко сеттить, что при использование таба в кабал файле для индента он перестает билдить
Alex
Мне ужас как неуднобно. В С++ коде у меня табы, в хаскеле спейсы и там и там я использую ВСкод.
Alex
Наверно нужно гуглить как сеттить настройки для расширений файлов
Alex
Не заставило себя долго ждать
Alex
Есть вот такая штука
Alex
"editor.detectIndentation": true
Алексей
Мне ужас как неуднобно. В С++ коде у меня табы, в хаскеле спейсы и там и там я использую ВСкод.
У vscode есть настройки рабочих областей, тогда будте создана директория .vscode с файлом settings.json и там настройки можно указать локальные для текущего проекта
кана
ну или просто перейти везде на спейсы
кана
"[haskell]": { "editor.tabSize": 4 },
Cheese
Мне ужас как неуднобно. В С++ коде у меня табы, в хаскеле спейсы и там и там я использую ВСкод.
считай, что это такой язык, что заставляет писать переносимый код
Alex
считай, что это такой язык, что заставляет писать переносимый код
А какая существует связь между переносимостью кода и индентом?
undefined
"[haskell]": { "editor.tabSize": 4 },
Вместо вот такого можно еще .editorconfig юзать
Dmitry
Непереносимо :(