Personal tools

Non-trivial type synonyms

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
m (Moving editorial comments to the talk page)
m (Adding Category)
Line 52: Line 52:
 
* [[Wrapper types]].
 
* [[Wrapper types]].
   
----
+
[[Category:Idioms]]
CategoryIdiom
 

Revision as of 14:58, 30 September 2006

1 Make the type system work for you

To avoid Miles/Km , feet/metres goofs:

rather than

	type Miles = Int

use

	newtype Miles = Miles Int

together with

	toMiles :: Int -> Miles
	fromMiles :: Miles -> Int

these can be redefined to be "id" later, after the code is stablized.


2 Alternate Miles etc. definitions

No need to change things : The functions toMiles and fromMiles is already effectively id !

A "newtype" definition just generates a new type whose implementation is the same as the old one.

The constructor (and possibly selector) really does nothing except coerce between the new type and the old one.

So as
undefined
is Haskells notation for bottom
	toMiles undefined === undefined

which isn't the case if we use a "data" definition.


Structures might be a bit more convenient here.

  newtype Miles = Miles { fromMiles :: Int }
  toMiles = Miles
      {- or just use Miles, though this is harder to excise later -}

For tracking more complex units, you may be able to get some of the way by using Phantom types or creative use of Functional dependencies.


3 See also