Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.47 KB | None | 0 0
  1. module Units where
  2.  
  3. import Data.Maybe
  4.  
  5. data Unit
  6. = Meter | Kilometer | Inch | Foot | Millimeter | Centimeter | Nanometer
  7. | Yard | Chain | Furlong | Mile | Thou | Micrometer
  8. deriving (Eq, Show)
  9.  
  10. -- | @Convert a b x@ states that @a@ equals @x@ @b@s.
  11. data Conversion = Convert
  12. { from :: Unit
  13. , to :: Unit
  14. , factor :: Double }
  15. deriving (Eq, Show)
  16.  
  17. flipConversion :: Conversion -> Conversion
  18. flipConversion (Convert f t x) = Convert t f (recip x)
  19.  
  20. conversions :: [Conversion]
  21. conversions = forward ++ backward
  22. where backward = map flipConversion forward
  23. forward =
  24. [ Convert Meter Kilometer 0.001
  25. , Convert Meter Millimeter 1000
  26. , Convert Meter Centimeter 100
  27. , Convert Meter Nanometer 1.0e9
  28. , Convert Meter Micrometer 1.0e6
  29. , Convert Foot Inch 12
  30. , Convert Inch Meter 0.0254
  31. , Convert Yard Foot 3
  32. , Convert Chain Yard 22
  33. , Convert Furlong Chain 10
  34. , Convert Mile Furlong 8
  35. , Convert Inch Thou 1000 ]
  36.  
  37. convert :: Unit -> Unit -> Double -> Maybe Double
  38. convert = go []
  39. where go visited u v x
  40. | u == v = Just x
  41. | u `elem` visited = Nothing
  42. | otherwise =
  43. let next = filter (\c -> from c == u) conversions
  44. in listToMaybe $ flip mapMaybe next $ \c ->
  45. go (u : visited) (to c) v (factor c * x)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement