it seems intuitively obvious following law should hold:
traverse f . fmap g = traverse (f . g) the traversable law seems apply directly is
fmap g = runidentity . traverse (identity . g) that changes problem to
traverse f . runidentity . traverse (identity . g) the law seems have vaguely right shape apply naturality law. that, however, applicative transformations, , don't see of around.
unless i'm missing something, thing left parametricity proof, , i've not yet gotten clue how write those.
note proof isn't necessary, result in question indeed free theorem. see reid barton's answer.
i believe do:
traverse f . fmap g -- lhs by fmap/traverse law,
traverse f . runidentity . traverse (identity . g) since fmap identity id,
runidentity . fmap (traverse f) . traverse (identity . g) the compose law offers way collapse 2 traversals one, must first introduce compose using getcompose . compose = id.
runidentity . getcompose . compose . fmap (traverse f) . traverse (identity . g) -- composition law: runidentity . getcompose . traverse (compose . fmap f . identity . g) again using identity fmap,
runidentity . getcompose . traverse (compose . identity . f . g) compose . identity applicative transformation, naturality,
runidentity . getcompose . compose . identity . traverse (f . g) collapsing inverses,
traverse (f . g) -- rhs invoked laws , corollaries, sake of completeness:
-- composition: traverse (compose . fmap g . f) = compose . fmap (traverse g) . traverse f -- naturality: t . traverse f = traverse (t . f) -- every applicative transformation t -- `fmap` traversal: fmap g = runidentity . traverse (identity . g) the latter fact follows identity law, traverse identity = identity, plus uniqueness of fmap.
Comments
Post a Comment