Skip to content

Instantly share code, notes, and snippets.

@nebuta
Created May 31, 2012 07:58
Show Gist options
  • Save nebuta/2841750 to your computer and use it in GitHub Desktop.
Save nebuta/2841750 to your computer and use it in GitHub Desktop.
Haskell unit calculation test
-- 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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment