[Haskell-cafe] Type Synonyms

Jonathan Cast jonathanccast at fastmail.fm
Thu Oct 11 18:15:00 EDT 2007


On Fri, 2007-10-12 at 11:00 +1300, ok wrote:
> On 11 Oct 2007, at 4:06 pm, Tom Davies basically asked for
> something equivalent to Ada's
> 	type T is new Old_T;
> which introduces a *distinct* type T that has all the operations and
> literals of Old_T.  In functional terms, suppose there is a function
> 	f :: ... Old_T ... Old_T ... Old_T ...
> then you get a function
> 	f :: ... T ... T ... T ...
> where Old_T has been uniformly and consistently replaced by T.
> More precisely, this happens to the *built in* operations of the
> type; it doesn't automatically apply to user-defined operations.
> 
> It's extraordinarily useful in Ada.  My standard example is that you
> can have a 2D array where row subscripts and column subscripts act in
> almost all ways like integers BUT they are incompatible types so you
> cannot possibly mix them up.
> 
> Haskell's newtype comes close, but not quite close enough.
> If I write
> 	newtype Foo = Foo String
> I cannot then write
> 	x :: Foo
> 	x = "boojumed"
> Similarly, if I write
> 	newtype Row = Row Int
> 	newtype Col = Col Int
> I cannot use 1 as a Row or Col value, but must instead write
> Row 1 or Col 1.
> 
> This *is* a limitation of the Haskell type system, and it *does*
> on occasion lead to more long-winded code.  But I suspect that it
> is not a major problem.
> 
> For the specific case of numeric types, it is possible to get  
> essentially
> the Ada result, with the same convenience of use, but not the same
> convenience of setup.
> 
> 	newtype Row = Row Int deriving (Eq,Ord,Show)
> 
> 	instance Num Row where
> 	  (Row x) + (Row y) = Row (x + y)
> 	  (Row x) - (Row y) = Row (x - y)
> 	  (Row x) * (Row y) = Row (x * y)
> 	  fromInteger i = Row (fromInteger i)
> 	  ...
> 	instance Integral Row where
> 	  ...

*Warning: GHC extension*

newtype Row = Row Int
  deriving (Eq,Ord,Show,Read,Num,Integral,...)

jcc




More information about the Haskell-Cafe mailing list