<div dir="ltr"><div class="gmail_extra">Hello,</div><div class="gmail_extra"><br></div><div class="gmail_extra">I'm not sure if this is what you're looking for, but vinyl + lens state monad combinators let you write something like this:</div><div class="gmail_extra"><br></div><div class="gmail_extra">foo :: State (Rec Foo [B,C,F]) Bar</div><div class="gmail_extra">foo = ...</div><div class="gmail_extra"><br></div><div class="gmail_extra">bar = State (Rec Foo [A,B,C,D,E,F]</div><div class="gmail_extra">bar = do</div><div class="gmail_extra">   ...</div><div class="gmail_extra">   x <- zoom rsubset foo</div><div class="gmail_extra">   ...</div><div class="gmail_extra">   rlens SA .= 3</div><div class="gmail_extra">   ...</div><div class="gmail_extra"><br></div><div class="gmail_extra">Unfortunately Vinyl has O(n) lookup (unless it gets optimized away by sufficiently glorious haskell compiler, I guess, but I have no idea whether it actually can happen). But I'm not sure if the speed impact is noticeable, compared to using monad transformer stacks, for example.</div><div class="gmail_extra"><br></div><div class="gmail_extra"><a href="http://hackage.haskell.org/package/vinyl">http://hackage.haskell.org/package/vinyl</a><br></div><div class="gmail_extra"><a href="http://hackage.haskell.org/package/vinyl-0.5.1/docs/Data-Vinyl-Lens.html">http://hackage.haskell.org/package/vinyl-0.5.1/docs/Data-Vinyl-Lens.html</a><br></div><div class="gmail_extra"><a href="http://hackage.haskell.org/package/lens">http://hackage.haskell.org/package/lens</a><br></div><div class="gmail_extra"><a href="https://www.fpcomplete.com/school/to-infinity-and-beyond/pick-of-the-week/a-little-lens-starter-tutorial">https://www.fpcomplete.com/school/to-infinity-and-beyond/pick-of-the-week/a-little-lens-starter-tutorial</a><br></div><div class="gmail_extra"><br></div><div class="gmail_extra">Best regards,</div><div class="gmail_extra">Marcin Mrotek</div></div>