Non-trivial type synonyms
From HaskellWiki
(Difference between revisions)
(Convert from HaWiki) |
m (Moving editorial comments to the talk page) |
||
| Line 19: | Line 19: | ||
| - | |||
==Alternate Miles etc. definitions == | ==Alternate Miles etc. definitions == | ||
| Line 38: | Line 37: | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
Structures might be a bit more convenient here. | Structures might be a bit more convenient here. | ||
| Line 50: | Line 44: | ||
{- or just use Miles, though this is harder to excise later -} | {- or just use Miles, though this is harder to excise later -} | ||
</haskell> | </haskell> | ||
| - | For tracking more complex units, you may be able to get some of the way by using | + | 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]]. |
Revision as of 14:57, 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 asundefined
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
- For an example toy implementation using Phantom types & Functional dependencies, see Dimensionalized numbers
- Wrapper types.
CategoryIdiom
