Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {-# LANGUAGE GADTs #-}
- {-# LANGUAGE InstanceSigs #-}
- class Prefix p where
- unitNum :: f p -> Double
- name :: f p -> String
- data Kilo
- instance Prefix Kilo where
- unitNum _ = 10^3
- name _ = "Kilo"
- data Hekto
- instance Prefix Hekto where
- unitNum _ = 10^2
- name _ = "Hekto"
- data Meters prefix where
- Meters :: Prefix p => Double -> Meters p
- --Unødvendig abstraktsjon, men orker ikke fjerne
- mapMeters :: Prefix p => (Double -> Double) -> Meters p -> Meters p
- mapMeters f (Meters m1) = Meters $ f m1
- lift2Meters :: Prefix p => (Double -> Double -> Double) -> Meters p -> Meters p -> Meters p
- lift2Meters f (Meters m1) (Meters m2) = Meters $ f m1 m2
- instance Prefix p => Num (Meters p) where
- (+) = lift2Meters (+)
- (*) = error "WRONG *"
- (-) = lift2Meters (-)
- abs = mapMeters abs
- fromInteger = Meters . fromInteger
- signum = mapMeters signum
- instance Prefix p => Show (Meters p) where
- show m = show (getMeters m) ++ " : m (" ++ name m ++ ")"
- getMeters :: Meters p -> Double
- getMeters (Meters m) = m
- convMeters :: (Prefix p1,Prefix p2) => Meters p1 -> Meters p2 -> Meters p1
- convMeters m1 m2 = Meters $ (getMeters m2 * unitNum m2) / unitNum m1
- class Unit u where
- (!+) :: (Prefix p1,Prefix p2) => u p1 -> u p2 -> u p1
- --Altfor tom
- instance Unit Meters where
- (!+) :: (Prefix p1,Prefix p2) => Meters p1 -> Meters p2 -> Meters p1
- m1 !+ m2 = Meters $ getMeters m1 + m3
- where
- Meters m3 = convMeters m1 m2
- --Tester
- hek5 :: Meters Hekto
- hek5 = Meters 5
- hek10 :: Meters Hekto
- hek10 = Meters 10
- kilo5 :: Meters Kilo
- kilo5 = Meters 5
- --Pga Num-typeclass kan man lage Meters-tall direkte
- hek5' :: Meters Hekto
- hek5' = 5
- main :: IO ()
- main = do
- print $ hek5 !+ hek10
- print $ hek10 !+ kilo5
- print kilo5
- print $ convMeters hek10 kilo5
- print $ hek5 + 10 -- 10 blir her 10 hekto automatisk
- --print $ hek5 + kilo5
- --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