Guest User

Untitled

a guest
Nov 17th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.10 KB | None | 0 0
  1. {-# LANGUAGE KindSignatures, DataKinds, ScopedTypeVariables #-}
  2. module Restklassenring where
  3.  
  4. import GHC.TypeLits
  5. import Data.Proxy
  6.  
  7. newtype Restklassenring (n :: Nat) a = Val {getVal :: a}
  8.  
  9. getIntegral :: (Integral a, KnownNat n) => Proxy n -> a
  10. getIntegral = fromInteger . toInteger . natVal
  11.  
  12. instance (Integral a, Num a, KnownNat n) => Num (Restklassenring n a) where
  13. (Val a) + (Val b) = Val $ (a + b) `mod` (getIntegral (Proxy :: Proxy n))
  14. (Val a) * (Val b) = Val $ (a * b) `mod` (getIntegral (Proxy :: Proxy n))
  15. signum = const $ Val $ fromInteger $ 1
  16. abs = id
  17. negate (Val a) = let
  18. modulus = toInteger $ natVal (Proxy :: Proxy n)
  19. a' = toInteger a
  20. b = modulus - a' in
  21. fromInteger b
  22. fromInteger i | i >= 0 = Val $ (fromInteger i) `mod` (getIntegral (Proxy :: Proxy n))
  23. | otherwise = negate $ fromInteger $ negate i
  24.  
  25. instance (Show a) => Show (Restklassenring n a) where
  26. show (Val a) = show a
  27.  
  28. x :: Restklassenring 7 Integer
  29. x = 13
  30.  
  31. y :: Restklassenring 7 Integer
  32. y = -2
  33.  
  34.  
  35. main :: IO ()
  36. main = do
  37. print x -- 6
  38. print y -- 5
  39. print (x + y) -- 4
Add Comment
Please, Sign In to add comment