Restricted type synonyms are a mechanism for defining abstract datatypes. You can achieve similar effects, and more portably, using the Haskell 98 module system.

The idea is that you can say that a type synonym is transparent in the definitions of certain functions (the operations on the type), but opaque elsewhere, by writing

type Table a b = [(a,b)] in empty :: Table a b, isEmpty :: Table a b -> Bool, add :: a -> b -> Table a b -> Table a b, search :: a -> Table a b -> Maybe b empty = [] isEmpty = null add a b t = (a,b):t search = lookupor equivalently

type Table a b = [(a,b)] in empty, isEmpty, add, search empty :: Table a b empty = [] ...See Section 7.3.5 of the