On Dec 20, 2007 9:34 AM, Adrian Neumann <[EMAIL PROTECTED]> wrote:
> Hello haskell-cafe!
>
> After making "data Number = Zero | Succ Number" an instance of
> Integral, I wondered how I could do the same with galois fields. So
> starting with Z mod p, I figured I'd need something like this
>
> data GF = GF Integer Integer
>
> so that each element of the finite field would remember p. However I
> can't think of a way to use the typesystem to ensure that p is always
> the same. I think that would need an infinite number of different
> types, but the type hackers here probably know something better.

Yes, you can have some fun by taking your Number definition to the type level:

data Zero    -- phantom type, no implementation
data Succ a  -- same

class Runtimify a where
    runtimify :: a -> Integer

instance Runtimify Zero where
    runtimify _ = 0

instance (Runtimify a) => Runtimify (Succ a) where
    runtimify _ = 1 + runtimify (undefined :: a)

data GF p = GF Integer

instance (Runtimify p) => Num (GF p) where
    -- you fill in the rest :-)

Note that p is encoded in only a type variable, so you'll
have to use "runtimify" (sorry for the silly name) to get
it out.

Luke
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to