
As a ‘hello world’ example for type definitions, I like to define a numeric type that can handle the mod p multiplicative group, where p is prime. This requires: • Implementing interface functions • Defining non-trivial implementations, where constructor must be private, etc. • Invoking an abstract superclass concrete instance method from within the subclass method definition The latter appears not to be possible in Haskell. Is this true? Here’s the basic code, but I punted on x^n. It looks like I’d have to paste in the entire original definition of ‘^’. data Modp a = Modp a a deriving (Eq, Show) mkModp p n | isPrime p = Modp p (n `mod` p) | otherwise = error $ show p ++ " is not a prime" instance Integral a => Num (Modp a) where (Modp q n) + (Modp p m) | p==q = Modp p $ (n+m) `mod` p | otherwise = error $ "unequal moduli" (Modp p n) * (Modp q m) | p==q = Modp p $ (n*m) `mod` p | otherwise = error $ "unequal moduli" negate (Modp p n) = Modp p (p-n) -- can't reuse base because ^ is impl. directly in prelude {- (Modp p x) ^ n | n <= p = (Modp p x) `baseExp` n | n1 == 0 = (Modp p x) | n > p = x ^ n1 where baseExp = ^ in Num n1 = n `mod` p -} instance Integral a => Fractional (Modp a) where recip (Modp p n) = (Modp p n)^(p-2) isPrime p = True -- stub