[Haskell-cafe] Language extensions [was: Memoization]

Ketil Malde ketil at ii.uib.no
Wed May 30 03:03:29 EDT 2007


On Tue, 2007-05-29 at 21:28 +0100, Andrew Coppin wrote:

> > phantom types:
> >  the types of ghost values (in other words, we are only interested in
> >  the type, not in any value of that type).

> Mmm... Still not seeing a great amount of use for this one.

The point is to 'tag' something with a type (at compile time) without
actually having any value of that type around at run time.

For instance, you could use this to keep track of the encodings for
strings of 8-bit characters.

Say you have a data type for your strings, like so:

	data FPS enc = FPS [Word8] deriving Show

'enc' is now a phantom type, it has no bearing on the actual value,
which is always a list of Word8s, right?

You can then define a set of encoding data types, and class for them:

	data Latin1
	data KOI8R

	class Encoding e where
	   w2c :: e -> Word8 -> Char
	   c2w :: e -> Char  -> Word8

The Latin1 instance is easy:

	instance Encoding Latin1 where
	   w2c _ = chr . fromIntegral
	   c2w _ = fromIntegral . ord

KOI8 is a bit more involved, so I omit that.  Now we can define
functions for converting to/from [Char]:

	pack :: forall e . Encoding e => String -> FPS e
	pack = FPS . map (c2w (undefined :: e))

	unpack :: forall e . Encoding e => FPS e -> String 
	unpack (FPS s) = map (w2c (undefined :: e)) s

Loading this in GHCi (requires -fglasgow-exts), you can do:

	*Main> pack "foobar"  :: FPS Latin1
	FPS [102,111,111,98,97,114]

i.e. ord 'f' to ord 'r'.

	*Main> pack "foobar"  :: FPS KOI8R
	FPS [202,211,211,198,197,214]

This is a fake KOI8R instance, but demonstrates the point: by requiring
a different type, a different result is achieved.  Note that the
resulting FPS retains the type, so that when I do:

	*Main> unpack it
	"foobar"

...I get back the original string.

Disclaimers: There are more elaborate and elegant examples of phantom
types out there, look for e.g. Oleg's posts on the subject.  The above
does not constitute legal advice.  Slippery when wet, do not cover,
batteries not included, and your mileage may vary.

-k






More information about the Haskell-Cafe mailing list