RosettaCodeData/Task/Haversine-formula/Haskell/haversine-formula.hs
2017-09-25 22:28:19 +02:00

33 lines
902 B
Haskell

import Text.Printf
import Control.Arrow ((***))
-- The haversine of an angle.
haversine :: Float -> Float
haversine = (^ 2) . sin . (/ 2)
-- The approximate distance, in kilometers, between two points on Earth.
-- The latitude and longtitude are assumed to be in degrees.
earthDist :: (Float, Float) -> (Float, Float) -> Float
earthDist = distDeg 6371
where
distDeg radius p1 p2 = distRad radius (deg2rad p1) (deg2rad p2)
distRad radius (lat1, lng1) (lat2, lng2) =
(2 * radius) *
asin
(min
1.0
(sqrt $
haversine (lat2 - lat1) +
((cos lat1 * cos lat2) * haversine (lng2 - lng1))))
deg2rad = d2r *** d2r
where
d2r = (/ 180) . (pi *)
main :: IO ()
main =
printf
"The distance between BNA and LAX is about %0.f km.\n"
(earthDist bna lax)
where
bna = (36.12, -86.67)
lax = (33.94, -118.40)