[Haskell-cafe] How do I simulate dependent types using phantom
types?
Lennart Augustsson
lennart at augustsson.net
Sat Aug 18 15:32:10 EDT 2007
Use
value :: a -> Integer
On 8/18/07, DavidA <polyomino at f2s.com> wrote:
>
> Hi,
>
> I am trying to implement quadratic fields Q(sqrt d). These are numbers of
> the
> form a + b sqrt d, where a and b are rationals, and d is an integer.
>
> In an earlier attempt, I tried
> data QF = QF Integer Rational Rational
> (see http://www.polyomino.f2s.com/david/haskell/hs/QuadraticField.hs.txt)
> The problem with this approach is that it's not really type-safe:
> I can attempt to add a + b sqrt 2 to c + d sqrt 3, whereas this should be
> a
> type error because 2 /= 3.
>
> So I thought I'd have a go at doing it with phantom types. In effect I'd
> be
> using phantom types to simulate dependent types. Here's the code:
>
> {-# OPTIONS_GHC -fglasgow-exts #-}
>
> import Data.Ratio
>
> class IntegerType a where
> value :: Integer
>
> data Two
> instance IntegerType Two where value = 2
>
> data Three
> instance IntegerType Three where value = 3
>
> data QF d = QF Rational Rational deriving (Eq)
>
> instance IntegerType d => Show (QF d) where
> show (QF a b) = show a ++ " + " ++ show b ++ " sqrt " ++ show value
>
> instance IntegerType d => Num (QF d) where
> QF a b + QF a' b' = QF (a+a') (b+b')
> negate (QF a b) = QF (-a) (-b)
> QF a b * QF c d = QF (a*c + b*d*value) (a*d + b*c)
> fromInteger n = QF (fromInteger n) 0
>
> The problem is, this doesn't work. GHC complains:
> The class method `value'
> mentions none of the type variables of the class IntegerType a
> When checking the class method: value :: Integer
> In the class declaration for `IntegerType'
>
> Is what I'm trying to do reasonable? If no, what should I be doing
> instead? If
> yes, why doesn't GHC like it?
>
> Thanks, David
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20070818/fd11571b/attachment.htm
More information about the Haskell-Cafe
mailing list