Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Haskell unit calc test
- data (Num a) => Unit a = Unit a a a -- dimensions of meter, kilogram, and second
- deriving (Eq)
- instance (Num a)=>Show (Unit a) where
- show (Unit m k s) = (f "kg" k) ++ " " ++ (f "m" m) ++ " " ++(f "s" s)
- where
- f s 0 = ""
- f s 1 = s
- f s d = s ++ "^" ++ show d
- instance (Num a,Num b)=>Show (UnitNum a b) where
- show (UnitNum a u) = show a ++ "[" ++ show u ++ "]"
- data (Num a, Num b) => UnitNum a b = UnitNum a (Unit b)
- deriving (Eq)
- instance (Num a,Num b) => Num (UnitNum a b) where
- (UnitNum a u1) + (UnitNum b u2)
- | u1 == u2 = UnitNum (a + b) u1
- | otherwise = error "Dimensions don't match."
- (UnitNum a u1) - (UnitNum b u2)
- | u1 == u2 = UnitNum (a - b) u1
- | otherwise = error "Dimensions don't match."
- (UnitNum a u1) * (UnitNum b u2) = UnitNum (a * b) (unitMult u1 u2)
- signum (UnitNum a u) = UnitNum (signum a) (Unit 0 0 0)
- abs (UnitNum a u) = UnitNum (abs a) u
- fromInteger x = UnitNum (fromIntegral x) (Unit 0 0 0)
- unitNum :: (Num a,Num b)=> a -> (b,b,b) -> UnitNum a b
- unitNum v (m,k,s) = UnitNum v (Unit m k s)
- unitMult :: Num a => Unit a -> Unit a -> Unit a
- unitMult (Unit m1 k1 s1) (Unit m2 k2 s2) = Unit (m1+m2) (k1+k2) (s1+s2)
- unitDiv :: Num a => Unit a -> Unit a -> Unit a
- unitDiv (Unit m1 k1 s1) (Unit m2 k2 s2) = Unit (m1-m2) (k1-k2) (s1-s2)
Add Comment
Please, Sign In to add comment