Кажется интуитивно очевидным, что должен соблюдаться следующий закон:
traverse f . fmap g = traverse (f . g)
Единственный закон Traversable
, который, как представляется, применяется непосредственно, это
fmap g = runIdentity . traverse (Identity . g)
Это изменяет проблему на
traverse f . runIdentity . traverse (Identity . g)
Единственный закон, который, по-видимому, имеет смутно правильную форму для применения к этому, - закон естественности. Это, однако, касается аппликативных преобразований, и я не вижу никого из них.
Если мне что-то не хватает, остается только доказательство параметричности, и я еще не понял, как их записать.