-
Notifications
You must be signed in to change notification settings - Fork 0
/
Modular.hs
24 lines (16 loc) · 653 Bytes
/
Modular.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Modular where
import GHC.TypeLits
import Data.Proxy
newtype Mod (n :: Nat) = Mod { unMod :: Int }
instance Show (Mod n) where
show (Mod n) = show n
type Mod7 = Mod 7
instance KnownNat n => Num (Mod n) where
Mod a + Mod b = Mod $ (a + b) `mod` (fromIntegral $ natVal (Proxy :: Proxy n))
Mod a * Mod b = Mod $ (a * b) `mod` (fromIntegral $ natVal (Proxy :: Proxy n))
fromInteger i = Mod $ fromIntegral $ i `mod` (natVal (Proxy :: Proxy n))
instance KnownNat n => Fractional (Mod n) where
recip = (^ (natVal (Proxy :: Proxy n) - 2))