Зигохистоморфный
просто читать - до одного места
Зигохистоморфный
иди каты например решай
Misha
@xgrommx а какую инфу они покрывают вообще?
Misha
Я вообще не очень представляю себе как промоделировать задачу "показать человеку как строить человеческие монад стэки" в контексте задачек — для этого надо написать софтину
Aleksei (astynax)
Для закрепления понимания можно порешать задания для курса NICTA - после LYaH хорошо зайдут
Aleksei (astynax)
А читать - Parallel and Concurrent Programming in Haskell
Aleksei (astynax)
По монадкам и трансформерам можно почитать пейпер "All about Monads" - там для каждой из базовых монад есть пара понятных примеров
Misha
Я еще нахожу typeclassopedia мастридом, там как раз уровень невысокий.
Aleksei (astynax)
"как строить человеческие монад стэки" - тут всё похоже на пресловутые паттерны проектирования: нужно состояние, втыкаешь State, нужна запись промежуточных результатов - Writer
Aleksei (astynax)
+1 за typeclassopedia
Misha
Misha
:peka:
Misha
https://www.fpcomplete.com/blog/2017/06/readert-design-pattern
Aleksei (astynax)
Глубокие стэки нечасто бывают в жизни
Misha
Ну если размер стэка 3 то можно пережить, наверное
Aleksei (astynax)
3 - норм. Плохо, когда все три слоя присутствуют в сигнатурах большей части кода - когда даже чистые функции запачканы по причине того, что "так быстрее писать"
Misha
А, ну тайпкласс фигакс на свой слой. То как ты описал — да, жутко. Дальше распутывать макароны будет мучительно больно.
Alexander
а после того как научишься делать стеки - берёшь и используешь ReaderT Env IO и морфизмы между такими
Misha
Не понял про морфизмы. Если речь идет о том чтобы какой-то кусок заменить на другой, то вроде хватает https://hackage.haskell.org/package/mmorph-1.0.9/docs/Control-Monad-Morph.html#t:MFunctor
Misha
и подобных
Misha
(если стэк ненулевой высоты)
Misha
https://www.youtube.com/watch?v=YTaNkWjd-ac не к этому ли видосу референс?
Alexander
Control.Monad.Morph - это конечно про морфизмы, и или оно будет использоваться или руками, у Кметта конечно более полный и хороший вариант
Alexander
впрочем в случае с ReaderT Env IO эта полнота не нужна
Aleksei (astynax)
ReaderT Env IO это на верхнем уровне. Локально то и другие монадки могут быть, особенно в чистом коде - ExceptT/ValidationT всякие и State тот же
Alexander
да\
Misha
Бесспорно, иначе всё очень плохо абстрагируется.
Alexander
я про то, что идти в сторону больших стеков, которые 32Гб памяти при сборке выжирвают тоже плохо
Alexander
а у нас есть простой варинт, как сделать так чтобы traverse/alternative при хождении по map ключи видело?
Cheese
traverseWithKey
Kirill
Кстати есть где-нибудь best practice по отделению чистого кода от трансферов и монадок? А то каждый раз как нужно делать походы в базу вылезает IO
Misha
Абстрагируй базу тайпклассом.
Misha
Либо абстрагируй логику модификации и сделай инстанс через базу (с io констрейнтом) и через еще что-нибудь
Alexander
@cblp_su общее, а не из либы, так то ответ foldrWithKey
Kirill
Artyom
Alexander
class MonadDb m where operationsWithDb :: ...\
Cheese
Misha
SQL-shit нет опыта
Alexander
что-то что работает над любым applicative,alternative нужной формы
Alexander
или newtype какой в который завернуть
Kirill
Хотя наверно можно абстрагировать не саму базу, а операции над данными, потом закинуть это всё в монадку и в тестах можно будет подставлять Id
Alexander
ещё если не нравятся mtl-style монады, то можно в data structure все завернуть
Alexander
data MyDb = MyDb { operation1 :: .. -> IO ..., opertation2 :: .. -> IO ..}
Kirill
Alexander
mtl-style это выше что предложили
Alexander
вот, если есть такая структура данных ты можешь её подменять
Kirill
Mtl как раз знаю
Alexander
причем такой варинт легко поднимается в mtl style
Kirill
Это похоже на упрощение идеи с тайпклассами
Alexander
хуже только тем,что оно ганартировано не заинлайнится
Cheese
когда мне надо было в мапе на ключи смотреть, я изоморфировал её в assocs
Kirill
Точнее на спуск с уровня типов, на уровень данных
Cheese
assocs = iso Map.assocs Map.fromList
Alexander
делаешь класс class HasDb m where getDb :: m MyDb
Alexander
class MonadDb m where ...
op1 :: .. -> m ...
default op1 :: HasDb m, MonadIO m => ... -> m ,,,
op1 = getDb >=> liftIO op1
Alexander
@volhovm ^
Alexander
добавление в mtl стек будет таким сложным как instance HasDb X where ... ; instance MonadDb X
Misha
Ну мне кажется это не особо стандартный юзкейс
Misha
типа, зачем хранить и то и другое
Misha
вот то ли дело если ты в рантайме кладешь такую конфигурацию в Reader
Alexander
что значит то ли дело? так и делаешь
Misha
особенно все усложняется если метод конфигурации это что-то сложнее
Misha
типа там
Misha
data Conf = Conf { confFoo :: m Kek -> SomeShitT m () }
Alexander
зачем там m?
Misha
Я как-то пытался пихать ResourceT $ ConduitT $ ... чето такое в конфигурацию
Misha
Misha
ну захотелось :p
Misha
или какой-нибудь экшн иницилизации
Kirill
Alexander
в этом подходе клей по IO работает
Alexander
и делать hoist $ control $ \mmorph -> ...
Alexander
или ещё что