Guest User

Untitled

a guest
Oct 19th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.98 KB | None | 0 0
  1. {-# LANGUAGE GADTs #-}
  2. {-# LANGUAGE InstanceSigs #-}
  3.  
  4. class Prefix p where
  5. unitNum :: f p -> Double
  6. name :: f p -> String
  7.  
  8.  
  9. data Kilo
  10. instance Prefix Kilo where
  11. unitNum _ = 10^3
  12. name _ = "Kilo"
  13.  
  14. data Hekto
  15. instance Prefix Hekto where
  16. unitNum _ = 10^2
  17. name _ = "Hekto"
  18.  
  19.  
  20. data Meters prefix where
  21. Meters :: Prefix p => Double -> Meters p
  22.  
  23.  
  24.  
  25. --Unødvendig abstraktsjon, men orker ikke fjerne
  26. mapMeters :: Prefix p => (Double -> Double) -> Meters p -> Meters p
  27. mapMeters f (Meters m1) = Meters $ f m1
  28.  
  29. lift2Meters :: Prefix p => (Double -> Double -> Double) -> Meters p -> Meters p -> Meters p
  30. lift2Meters f (Meters m1) (Meters m2) = Meters $ f m1 m2
  31.  
  32. instance Prefix p => Num (Meters p) where
  33. (+) = lift2Meters (+)
  34. (*) = error "WRONG *"
  35. (-) = lift2Meters (-)
  36. abs = mapMeters abs
  37. fromInteger = Meters . fromInteger
  38. signum = mapMeters signum
  39.  
  40. instance Prefix p => Show (Meters p) where
  41. show m = show (getMeters m) ++ " : m (" ++ name m ++ ")"
  42.  
  43.  
  44. getMeters :: Meters p -> Double
  45. getMeters (Meters m) = m
  46.  
  47.  
  48.  
  49.  
  50.  
  51. convMeters :: (Prefix p1,Prefix p2) => Meters p1 -> Meters p2 -> Meters p1
  52. convMeters m1 m2 = Meters $ (getMeters m2 * unitNum m2) / unitNum m1
  53.  
  54. class Unit u where
  55. (!+) :: (Prefix p1,Prefix p2) => u p1 -> u p2 -> u p1
  56.  
  57.  
  58.  
  59. --Altfor tom
  60. instance Unit Meters where
  61. (!+) :: (Prefix p1,Prefix p2) => Meters p1 -> Meters p2 -> Meters p1
  62. m1 !+ m2 = Meters $ getMeters m1 + m3
  63. where
  64. Meters m3 = convMeters m1 m2
  65.  
  66.  
  67. --Tester
  68.  
  69. hek5 :: Meters Hekto
  70. hek5 = Meters 5
  71.  
  72. hek10 :: Meters Hekto
  73. hek10 = Meters 10
  74.  
  75. kilo5 :: Meters Kilo
  76. kilo5 = Meters 5
  77.  
  78. --Pga Num-typeclass kan man lage Meters-tall direkte
  79. hek5' :: Meters Hekto
  80. hek5' = 5
  81.  
  82.  
  83.  
  84.  
  85. main :: IO ()
  86. main = do
  87. print $ hek5 !+ hek10
  88. print $ hek10 !+ kilo5
  89. print kilo5
  90. print $ convMeters hek10 kilo5
  91.  
  92. print $ hek5 + 10 -- 10 blir her 10 hekto automatisk
  93.  
  94. --print $ hek5 + kilo5
  95. --Går ikke pga kan ikke legge sammen hekto og kilo på vanlig ikke-konverterende måte
Add Comment
Please, Sign In to add comment