{-# LANGUAGE OverloadedRecordDot #-} {-# LANGUAGE OverloadedRecordUpdate #-} data Foo = Foo {bar :: Foo} mfoo = fmap (.bar) $ Nothing bar = (Foo 1).bar fooplus f n = f {foo = f.bar + n} nestedFoo f = f.bar.bar.bar.bar.bar nestedFooUpdate f = f {bar.bar = f.bar} <> f {bar.bar.bar.bar} operatorUpdate f = f {(+) = 1}