This module is my answer to the pattern discussed in http:blog.ezyang.com201106apatternforincreasingsharing about maximizing sharing when transforming an algebraic data type.
The' Transhare
class is a kind of degerate case of Traverse
building on a new Applicative
data type called TransResult
defined below. The result transM
is a way to lift a
parsimonious transformer 'a > Maybe a', which indicates identity with Nothing
, to work on a
container with maximized sharing.
 data TransResult a
 = Original {
 getTrans :: a
  Transformed {
 getTrans :: a
 = Original {
 type TransM a = a > Maybe a
 type TransR a = a > TransResult a
 transMR :: TransM a > TransR a
 transRM :: TransR a > TransM a
 fromO :: a > TransResult a > TransResult a
 class Transhare f where
 transResult_laws :: Bool
Documentation
data TransResult a Source
Original  
 
Transformed  

Functor TransResult  
Applicative TransResult  
Transhare TransResult  
Eq a => Eq (TransResult a)  
Show a => Show (TransResult a) 
type TransR a = a > TransResult aSource
TransR
is a parsimonious transformer that returns (Original x) only if x is the original argument.
This must follow the law that TransMR . TransRM . t = t
The disadvantage of TransR
compared to TransM
is ensuring the above law and that sharing for
Original results is actually being done.
TransR
which implement sharing correctly are proper implementations of TransR
fromO :: a > TransResult a > TransResult aSource