Возьмём Клейсли-категорию для монады Writer. Затем определим функтор такой, что
F(a) = 1 + a * F(a) -- список
F(f) = id + f * F(f)
-- null -> null
-- (x, xs) -> (f x, F(f) xs)
где + и * в F(f) - choose и parcomp
Но в таком случае, если я ничего не путаю, не соблюдается F(f . g) = F(f) . F(g)
Действительно, возьмём f, пишущий "f" и возвращающий свой
(
Read more... )
Comments 8
Если Writer, то F(f) [1,1,1] напишет один "f"
Если списка, то F(f).F(g) вернёт writer-ы, которые пишут "fg"
"fffggg" не будет ни в одном из случаев.
Reply
Каждому a из Клейсли-категории ставит в соответствие [a]
Каждому морфизму a -w-> b ставит в соответствие [a] -w-> [b]
где a -w-> b - морфизм в Клейсли-категории.
Т.е. переводя на Hask:
map : (a -> Writer String b) -> [a] -> Writer String [b]
И вот как написать этот map, чтобы map f . map g === map (f . g)?
Reply
Что-то непонятно, у этой категории кодомен должен быть Writer a.
Насчёт Hask - какие типы у f и g?
Reply
Reply
F(a → Tb) |→ F(a) → T(F(b)) - не видно, почему бы так. Ну хотя бы коммутировать должен с Т.
Reply
Просто map и mapM в терминах стрелок выглядят одинаково, что наталкивает на некую общность, но при этом первая - функтор, а вторая - нет. Ну да и чёрт бы с ней, но есть ли какая-то абстракция для mapM? Она почти как функтор, но вот закон не соблюдается.
Reply
То есть, то, что ты говоришь, означает, по сути, что монадический трансформер ListT - неправильный. Это - давно известный факт, и на Haskell wiki есть способы исправить его: http://www.haskell.org/haskellwiki/ListT_done_right для начала.
Reply
Reply
Leave a comment