<div dir="ltr">Hello,<div><br></div><div>I'm trying to write a lens for a datatype which seems easy in the Twan van Laarhoven encoding but I cannot find it as easy in the profunctorial one</div><div><pre style="color:rgb(0,0,0);font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px;text-decoration-style:initial;text-decoration-color:initial;word-wrap:break-word;white-space:pre-wrap">data Q5 a b = Q51 a (Identity b) | Q52 [b] 

lq5Twan :: Applicative f => (b -> f b') -> Q5 a b -> f (Q5 a b') 
lq5Twan f (Q51 a bs) = Q51 a <$> traverse f bs 
lq5Twan f (Q52 bs) = Q52 <$> traverse f bs 

data BT tt tt' b t t' a = BT1 (tt -> b) (t a) | BT2 (tt' -> b) (t' a) deriving (Functor,Foldable,Traversable) 
runBT (BT1 f x) = f x 
runBT (BT2 f x) = f x 

lq5Profunctor :: forall p a b b' . Traversing p => p b b' -> p (Q5 a b) (Q5 a b') 
lq5Profunctor = dimap pre post . second' . traverse' where 
  pre (Q51 a x) = ((), BT1 (Q51 a) x) 
  pre (Q52 bs) = ((), BT2 Q52 bs) 
  post ((),x) = runBT x</pre></div><div><br></div><div>The issue here is that I need to project type 'b' into 2 different Traversable (sketched [] and Identity) so the traverse'  must handle both together.</div><div><br></div><div>Is the lq5Twan correct ?</div><div><br></div><div>Which simpler ways to write the lq5Profunctor we have ?</div><div><br></div><div>Thanks for help.</div><div><br></div><div>paolino</div></div>