[Haskell-cafe] More concise code using phantom types

Nikita Kartashov snailandmail at gmail.com
Fri Aug 7 23:28:57 UTC 2015


Consider the following code:

module Units where

data Units a = U Double deriving Eq

units :: Double -> a -> Units a
units value _ = U value

data Meters
data Yards

meters = undefined :: Meters
yards = undefined :: Yards

instance Show Meters where
  show _ = "meters"

instance Show Yards where
  show _ = "yards"

extractA :: Units a -> a
extractA = undefined

instance Show a => Show (Units a) where
  show u@(U value) = show value ++ " " ++ show $ extractA u

main = (print $ units 5 yards) >> (print $ units 5 meters)

Is it possible to use something instead extractA function here? For example, substitute "extractA u” with “undefined :: a”?
GHC disallows it, so is there a way to explain that I only need a token with type a?

Also, with highlighting on lpaste: http://lpaste.net/138219.

With regards,
Nikita Kartashov

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20150808/26a1b3fc/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 496 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20150808/26a1b3fc/attachment.sig>

More information about the Haskell-Cafe mailing list