Ah, in the short ones: `kickit` can be replaced by `run`.
Which is:
```
run :: (a -&> a) -> a
run h = invoke h id
```
I didn't need the `rep id` at all.
@fresheyeball Some resources:
* https://t.co/cPKfB6qjnY
* https://t.co/kk3NLAR9JQ
They are very mind-bending (to me).
I come back to play with them every so often to gradually improve my intuition, but it's slow going 😅.
@Quelklef Your current setup looks contravariant - notice how you have `p s t -> p a b`, but profunctor optic libs have `p a b -> p s t`. I'd suggest using these data and mapping function types to have the best time:
@sjoerd_visscher It think it immediately felt odd because you have to pick a nesting `f ∘ g` or `g ∘ f`. (I've definitely also used this instance before).
However, thinking it through a bit more, it's perhaps lining up with:
foldMap t (Day f g abc) ~
foldMap t (abc <$> toList f <*> toList g)
@sjoerd_visscher Yeah agreed, definitely not this zippy instance.
Could do something like `(Applicative f, Foldable f, f ~ g) => Foldable (Day f g)`, or first collapse the Day to a Compose - but neither of those feel entirely sensible either.
@runarorama@msimoni@cat_powered ( unsure how to fathom existential types being an escape of a type system; perhaps we have rather different things going on in our heads )
@Quelklef Something like this representation:
`data Lens s t a b = Lens (s -> a) (b -> s -> t)`
or even
`data Lens s t a b = forall x . Lens (s -> (a, x)) ((b, x) -> t)`
But not:
`forall p . Strong p => p a b -> p s t`
or:
`forall f . Functor f => (a -> f b) -> (s -> f t)`