Guest User

Untitled

a guest
Oct 15th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.32 KB | None | 0 0
  1. -- Haskell unit calc test
  2.  
  3. data (Num a) => Unit a = Unit a a a -- dimensions of meter, kilogram, and second
  4. deriving (Eq)
  5.  
  6. instance (Num a)=>Show (Unit a) where
  7. show (Unit m k s) = (f "kg" k) ++ " " ++ (f "m" m) ++ " " ++(f "s" s)
  8. where
  9. f s 0 = ""
  10. f s 1 = s
  11. f s d = s ++ "^" ++ show d
  12.  
  13. instance (Num a,Num b)=>Show (UnitNum a b) where
  14. show (UnitNum a u) = show a ++ "[" ++ show u ++ "]"
  15.  
  16. data (Num a, Num b) => UnitNum a b = UnitNum a (Unit b)
  17. deriving (Eq)
  18.  
  19. instance (Num a,Num b) => Num (UnitNum a b) where
  20. (UnitNum a u1) + (UnitNum b u2)
  21. | u1 == u2 = UnitNum (a + b) u1
  22. | otherwise = error "Dimensions don't match."
  23. (UnitNum a u1) - (UnitNum b u2)
  24. | u1 == u2 = UnitNum (a - b) u1
  25. | otherwise = error "Dimensions don't match."
  26. (UnitNum a u1) * (UnitNum b u2) = UnitNum (a * b) (unitMult u1 u2)
  27. signum (UnitNum a u) = UnitNum (signum a) (Unit 0 0 0)
  28. abs (UnitNum a u) = UnitNum (abs a) u
  29. fromInteger x = UnitNum (fromIntegral x) (Unit 0 0 0)
  30.  
  31. unitNum :: (Num a,Num b)=> a -> (b,b,b) -> UnitNum a b
  32. unitNum v (m,k,s) = UnitNum v (Unit m k s)
  33.  
  34. unitMult :: Num a => Unit a -> Unit a -> Unit a
  35. unitMult (Unit m1 k1 s1) (Unit m2 k2 s2) = Unit (m1+m2) (k1+k2) (s1+s2)
  36.  
  37. unitDiv :: Num a => Unit a -> Unit a -> Unit a
  38. unitDiv (Unit m1 k1 s1) (Unit m2 k2 s2) = Unit (m1-m2) (k1-k2) (s1-s2)
Add Comment
Please, Sign In to add comment