This module is provided for Haskell 98 compatibility.
If you are able to use Rank2Types, I advise you to instead use the rank 2 aliases

Lens, Lens'

Traversal, Traversal'

Setter, Setter'

Fold, Fold'

Getter, Getter'

from the lens-family package instead.

cloneLens allows one to circumvent the need for rank 2 types by allowing one to take a universal monomorphic lens instance and rederive a polymorphic instance.
When you require a lens family parameter you use the type ALens a a' b b' (or ALens' a b).
Then, inside a where clause, you use cloneLens to create a Lens type.