Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module Units where
- import Data.Maybe
- data Unit
- = Meter | Kilometer | Inch | Foot | Millimeter | Centimeter | Nanometer
- | Yard | Chain | Furlong | Mile | Thou | Micrometer
- deriving (Eq, Show)
- -- | @Convert a b x@ states that @a@ equals @x@ @b@s.
- data Conversion = Convert
- { from :: Unit
- , to :: Unit
- , factor :: Double }
- deriving (Eq, Show)
- flipConversion :: Conversion -> Conversion
- flipConversion (Convert f t x) = Convert t f (recip x)
- conversions :: [Conversion]
- conversions = forward ++ backward
- where backward = map flipConversion forward
- forward =
- [ Convert Meter Kilometer 0.001
- , Convert Meter Millimeter 1000
- , Convert Meter Centimeter 100
- , Convert Meter Nanometer 1.0e9
- , Convert Meter Micrometer 1.0e6
- , Convert Foot Inch 12
- , Convert Inch Meter 0.0254
- , Convert Yard Foot 3
- , Convert Chain Yard 22
- , Convert Furlong Chain 10
- , Convert Mile Furlong 8
- , Convert Inch Thou 1000 ]
- convert :: Unit -> Unit -> Double -> Maybe Double
- convert = go []
- where go visited u v x
- | u == v = Just x
- | u `elem` visited = Nothing
- | otherwise =
- let next = filter (\c -> from c == u) conversions
- in listToMaybe $ flip mapMaybe next $ \c ->
- go (u : visited) (to c) v (factor c * x)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement