type ('s, 't, 'a, 'b) lens = ('s -> 'a) * ('b -> 's -> 't) type ('s, 'a) lens' = ('s, 's, 'a, 'a) lens let lens ~view ~set = view, set let view (get, _) = get