úÎðâìb&      !"#$%None357!Setting a value within the range 0 and 60 using modulo arithmetic. modSeconds 7Seconds 7.0000 modSeconds 0Seconds 0.0000modSeconds (-0.0001)Seconds 59.9999 modSeconds 60Seconds 0.0000modSeconds 59.99999Seconds 60.0000modSeconds 59.999Seconds 59.9990 modSeconds 61Seconds 1.0000modSeconds (-1)Seconds 59.0000&DA prism on seconds to a double between 0 inclusive and 60 exclusive.(7 :: Double) ^? _SecondsJust (Seconds 7.0000)(0 :: Double) ^? _SecondsJust (Seconds 0.0000)(59 :: Double) ^? _SecondsJust (Seconds 59.0000)(59.99 :: Double) ^? _SecondsJust (Seconds 59.9900)(60 :: Double) ^? _SecondsNothing9all (\m -> _Seconds # m == (n :: Double)) (n ^? _Seconds)'nA show instance that prints to 4 decimal places. This is to take floating-point rounding errors into account.(&)'(&)'None357!Setting a value within the range 0 and 60 using modulo arithmetic. modMinutes 7 Minutes 7 modMinutes 0 Minutes 0 modMinutes 60 Minutes 0 modMinutes 1 Minutes 1 modMinutes 59 Minutes 59  modMinutes 61 Minutes 1modMinutes (-1) Minutes 59*<A prism on minutes to an integer between 0 and 59 inclusive.(7 :: Int) ^? _MinutesJust (Minutes 7)(0 :: Int) ^? _MinutesJust (Minutes 0)(59 :: Int) ^? _MinutesJust (Minutes 59)(60 :: Int) ^? _MinutesNothing6all (\m -> _Minutes # m == (n :: Int)) (n ^? _Minutes)+*,+*,None357 !Setting a value within the range -180 and 180 using modulo arithmetic.modDegreesLongitude 7DegreesLongitude 7modDegreesLongitude 0DegreesLongitude 0modDegreesLongitude 180DegreesLongitude 180modDegreesLongitude (-180)DegreesLongitude (-180)modDegreesLongitude 1DegreesLongitude 1modDegreesLongitude 179DegreesLongitude 179 modDegreesLongitude 181DegreesLongitude (-179)modDegreesLongitude (-181)DegreesLongitude 179modDegreesLongitude 600DegreesLongitude (-120)modDegreesLongitude (-600)DegreesLongitude 120 DThe degrees longitude that is symmetrical around the prime meridian.1antipodeDegreesLongitude # modDegreesLongitude 30DegreesLongitude (-30)2antipodeDegreesLongitude # modDegreesLongitude 100DegreesLongitude (-100)2antipodeDegreesLongitude # modDegreesLongitude 190DegreesLongitude 1700antipodeDegreesLongitude # modDegreesLongitude 0DegreesLongitude 0-JA prism on degrees longitude to an integer between -180 and 180 exclusive.(7 :: Int) ^? _DegreesLongitudeJust (DegreesLongitude 7)(0 :: Int) ^? _DegreesLongitudeJust (DegreesLongitude 0)!(179 :: Int) ^? _DegreesLongitudeJust (DegreesLongitude 179)!(180 :: Int) ^? _DegreesLongitudeNothing"(-179 :: Int) ^? _DegreesLongitudeJust (DegreesLongitude (-179))"(-180 :: Int) ^? _DegreesLongitudeNothingHall (\m -> _DegreesLongitude # m == (n :: Int)) (n ^? _DegreesLongitude) . -/    . -/None!"357,Setting a longitude using modulo arithmetic.modLongitude 20 20 20>Longitude (DegreesLongitude 20) (Minutes 20) (Seconds 20.0000)modLongitude 20 20 (-20)>Longitude (DegreesLongitude 20) (Minutes 19) (Seconds 40.0000)modLongitude 20 20 80>Longitude (DegreesLongitude 20) (Minutes 21) (Seconds 20.0000)modLongitude 20 80 20>Longitude (DegreesLongitude 21) (Minutes 20) (Seconds 20.0000)modLongitude 20 80 80>Longitude (DegreesLongitude 21) (Minutes 21) (Seconds 20.0000)modLongitude 20 80 (-20)>Longitude (DegreesLongitude 21) (Minutes 19) (Seconds 40.0000)modLongitude 200 20 20BLongitude (DegreesLongitude (-160)) (Minutes 20) (Seconds 20.0000)modLongitude 200 20 80BLongitude (DegreesLongitude (-160)) (Minutes 21) (Seconds 20.0000)modLongitude 200 80 20BLongitude (DegreesLongitude (-159)) (Minutes 20) (Seconds 20.0000)modLongitude 200 20 (-20)BLongitude (DegreesLongitude (-160)) (Minutes 19) (Seconds 40.0000)modLongitude 200 (-20) (-20)BLongitude (DegreesLongitude (-161)) (Minutes 39) (Seconds 40.0000)modLongitude 200 (-80) (-20)BLongitude (DegreesLongitude (-162)) (Minutes 39) (Seconds 40.0000)modLongitude 20 20 3620>Longitude (DegreesLongitude 21) (Minutes 20) (Seconds 20.0000)modLongitude 20 20 (-3580)>Longitude (DegreesLongitude 19) (Minutes 20) (Seconds 20.0000)modLongitude 200 20 3620BLongitude (DegreesLongitude (-159)) (Minutes 20) (Seconds 20.0000)modLongitude 200 20 (-3580)BLongitude (DegreesLongitude (-161)) (Minutes 20) (Seconds 20.0000)<The longitude that is symmetrical around the prime meridian.µfmap (\x -> antipodeLongitude # x) (do d <- (7 :: Int) ^? _DegreesLongitude; m <- (7 :: Int) ^? _Minutes; s <- (7 :: Double) ^? _Seconds; (d, m, s) ^? _Longitude :: Maybe Longitude)EJust (Longitude (DegreesLongitude (-7)) (Minutes 7) (Seconds 7.0000))0@A prism on longitude to a double between -180 and 180 exclusive..(7 :: Double) ^? _Longitude :: Maybe LongitudeBJust (Longitude (DegreesLongitude 7) (Minutes 0) (Seconds 0.0000))/(-7 :: Double) ^? _Longitude :: Maybe LongitudeEJust (Longitude (DegreesLongitude (-7)) (Minutes 0) (Seconds 0.0000))1(7.12 :: Double) ^? _Longitude :: Maybe LongitudeCJust (Longitude (DegreesLongitude 7) (Minutes 7) (Seconds 12.0000))2(-7.12 :: Double) ^? _Longitude :: Maybe LongitudeFJust (Longitude (DegreesLongitude (-7)) (Minutes 7) (Seconds 12.0000))Zfmap (\x -> _Longitude # x :: Double) ((7.12 :: Double) ^? _Longitude :: Maybe Longitude) Just 7.12Zfmap (\x -> _Longitude # x :: Double) ((-7.12 :: Double) ^? _Longitude :: Maybe Longitude) Just (-7.12)0(180 :: Double) ^? _Longitude :: Maybe LongitudeNothing1(-180 :: Double) ^? _Longitude :: Maybe LongitudeNothing5(15.63791 :: Double) ^? _Longitude :: Maybe LongitudeEJust (Longitude (DegreesLongitude 15) (Minutes 38) (Seconds 16.4760))2(179.1 :: Double) ^? _Longitude :: Maybe LongitudeEJust (Longitude (DegreesLongitude 179) (Minutes 5) (Seconds 60.0000))2(179.2 :: Double) ^? _Longitude :: Maybe LongitudeFJust (Longitude (DegreesLongitude 179) (Minutes 11) (Seconds 60.0000))Äfmap (\x -> _Longitude # x :: Double) (do deg <- (7 :: Int) ^? _DegreesLongitude; min <- (7 :: Int) ^? _Minutes; sec <- (7 :: Double) ^? _Seconds; (deg, min, sec) ^? _Longitude :: Maybe Longitude)Just 7.118611111111111Çfmap (\x -> _Longitude # x :: Double) (do deg <- (179 :: Int) ^? _DegreesLongitude; min <- (15 :: Int) ^? _Minutes; sec <- (6 :: Double) ^? _Seconds; (deg, min, sec) ^? _Longitude :: Maybe Longitude)Just 179.251666666666671SAn isomorphism on the triple of degrees longitude, minutes, seconds to a longitude.œdo deg <- (7 :: Int) ^? _DegreesLongitude; min <- (7 :: Int) ^? _Minutes; sec <- (7 :: Double) ^? _Seconds; (deg, min, sec) ^? _Longitude :: Maybe LongitudeBJust (Longitude (DegreesLongitude 7) (Minutes 7) (Seconds 7.0000)) do deg <- (179 :: Int) ^? _DegreesLongitude; min <- (59 :: Int) ^? _Minutes; sec <- (59 :: Double) ^? _Seconds; (deg, min, sec) ^? _Longitude :: Maybe LongitudeFJust (Longitude (DegreesLongitude 179) (Minutes 59) (Seconds 59.0000))do deg <- (-7 :: Int) ^? _DegreesLongitude; min <- (7 :: Int) ^? _Minutes; sec <- (7 :: Double) ^? _Seconds; (deg, min, sec) ^? _Longitude :: Maybe LongitudeEJust (Longitude (DegreesLongitude (-7)) (Minutes 7) (Seconds 7.0000))¡do deg <- (-179 :: Int) ^? _DegreesLongitude; min <- (59 :: Int) ^? _Minutes; sec <- (59 :: Double) ^? _Seconds; (deg, min, sec) ^? _Longitude :: Maybe LongitudeIJust (Longitude (DegreesLongitude (-179)) (Minutes 59) (Seconds 59.0000)) do deg <- (180 :: Int) ^? _DegreesLongitude; min <- (59 :: Int) ^? _Minutes; sec <- (59 :: Double) ^? _Seconds; (deg, min, sec) ^? _Longitude :: Maybe LongitudeNothing do deg <- (179 :: Int) ^? _DegreesLongitude; min <- (60 :: Int) ^? _Minutes; sec <- (59 :: Double) ^? _Seconds; (deg, min, sec) ^? _Longitude :: Maybe LongitudeNothing do deg <- (179 :: Int) ^? _DegreesLongitude; min <- (59 :: Int) ^? _Minutes; sec <- (60 :: Double) ^? _Seconds; (deg, min, sec) ^? _Longitude :: Maybe LongitudeNothingufmap (\x -> _Longitude # x :: (DegreesLongitude, Minutes, Seconds)) ((7 :: Double) ^? _Longitude :: Maybe Longitude)2Just (DegreesLongitude 7,Minutes 0,Seconds 0.0000)xfmap (\x -> _Longitude # x :: (DegreesLongitude, Minutes, Seconds)) ((7.12 :: Double) ^? _Longitude :: Maybe Longitude)3Just (DegreesLongitude 7,Minutes 7,Seconds 12.0000) 2345016   2345016None357!Setting a value within the range -90 and 90 using modulo arithmetic.modDegreesLatitude 7DegreesLatitude 7modDegreesLatitude 0DegreesLatitude 0modDegreesLatitude 90DegreesLatitude 90modDegreesLatitude (-90)DegreesLatitude (-90)modDegreesLatitude 1DegreesLatitude 1modDegreesLatitude 89DegreesLatitude 89 modDegreesLatitude 91DegreesLatitude (-89)modDegreesLatitude (-91)DegreesLatitude 89modDegreesLatitude 300DegreesLatitude (-60)modDegreesLatitude (-300)DegreesLatitude 60<The degrees latitude that is symmetrical around the equator./antipodeDegreesLatitude # modDegreesLatitude 30DegreesLatitude (-30)/antipodeDegreesLatitude # modDegreesLatitude 80DegreesLatitude (-80)0antipodeDegreesLatitude # modDegreesLatitude 110DegreesLatitude 70.antipodeDegreesLatitude # modDegreesLatitude 0DegreesLatitude 07GA prism on degrees latitude to an integer between -90 and 90 exclusive.(7 :: Int) ^? _DegreesLatitudeJust (DegreesLatitude 7)(0 :: Int) ^? _DegreesLatitudeJust (DegreesLatitude 0)(89 :: Int) ^? _DegreesLatitudeJust (DegreesLatitude 89)(90 :: Int) ^? _DegreesLatitudeNothing (-89 :: Int) ^? _DegreesLatitudeJust (DegreesLatitude (-89)) (-90 :: Int) ^? _DegreesLatitudeNothingFall (\m -> _DegreesLatitude # m == (n :: Int)) (n ^? _DegreesLatitude)879879None!"357+Setting a latitude using modulo arithmetic.modLatitude 20 20 20<Latitude (DegreesLatitude 20) (Minutes 20) (Seconds 20.0000)modLatitude 20 20 (-20)<Latitude (DegreesLatitude 20) (Minutes 19) (Seconds 40.0000)modLatitude 20 20 80<Latitude (DegreesLatitude 20) (Minutes 21) (Seconds 20.0000)modLatitude 20 80 20<Latitude (DegreesLatitude 21) (Minutes 20) (Seconds 20.0000)modLatitude 20 80 80<Latitude (DegreesLatitude 21) (Minutes 21) (Seconds 20.0000)modLatitude 20 80 (-20)<Latitude (DegreesLatitude 21) (Minutes 19) (Seconds 40.0000)modLatitude 110 20 20?Latitude (DegreesLatitude (-70)) (Minutes 20) (Seconds 20.0000)modLatitude 110 20 80?Latitude (DegreesLatitude (-70)) (Minutes 21) (Seconds 20.0000)modLatitude 110 80 20?Latitude (DegreesLatitude (-69)) (Minutes 20) (Seconds 20.0000)modLatitude 110 20 (-20)?Latitude (DegreesLatitude (-70)) (Minutes 19) (Seconds 40.0000)modLatitude 110 (-20) (-20)?Latitude (DegreesLatitude (-71)) (Minutes 39) (Seconds 40.0000)modLatitude 110 (-80) (-20)?Latitude (DegreesLatitude (-72)) (Minutes 39) (Seconds 40.0000)modLatitude 20 20 3620<Latitude (DegreesLatitude 21) (Minutes 20) (Seconds 20.0000)modLatitude 20 20 (-3580)<Latitude (DegreesLatitude 19) (Minutes 20) (Seconds 20.0000)modLatitude 110 20 3620?Latitude (DegreesLatitude (-69)) (Minutes 20) (Seconds 20.0000)modLatitude 110 20 (-3580)?Latitude (DegreesLatitude (-71)) (Minutes 20) (Seconds 20.0000)4The latitude that is symmetrical around the equator.±fmap (\x -> antipodeLatitude # x) (do d <- (7 :: Int) ^? _DegreesLatitude; m <- (7 :: Int) ^? _Minutes; s <- (7 :: Double) ^? _Seconds; (d, m, s) ^? _Latitude :: Maybe Latitude)CJust (Latitude (DegreesLatitude (-7)) (Minutes 7) (Seconds 7.0000)):=A prism on latitude to a double between -90 and 90 exclusive.,(7 :: Double) ^? _Latitude :: Maybe Latitude@Just (Latitude (DegreesLatitude 7) (Minutes 0) (Seconds 0.0000))-(-7 :: Double) ^? _Latitude :: Maybe LatitudeCJust (Latitude (DegreesLatitude (-7)) (Minutes 0) (Seconds 0.0000))/(7.12 :: Double) ^? _Latitude :: Maybe LatitudeAJust (Latitude (DegreesLatitude 7) (Minutes 7) (Seconds 12.0000))0(-7.12 :: Double) ^? _Latitude :: Maybe LatitudeDJust (Latitude (DegreesLatitude (-7)) (Minutes 7) (Seconds 12.0000))Vfmap (\x -> _Latitude # x :: Double) ((7.12 :: Double) ^? _Latitude :: Maybe Latitude) Just 7.12Wfmap (\x -> _Latitude # x :: Double) ((-7.12 :: Double) ^? _Latitude :: Maybe Latitude) Just (-7.12)-(90 :: Double) ^? _Latitude :: Maybe LatitudeNothing.(-90 :: Double) ^? _Latitude :: Maybe LatitudeNothing3(15.63791 :: Double) ^? _Latitude :: Maybe LatitudeCJust (Latitude (DegreesLatitude 15) (Minutes 38) (Seconds 16.4760))/(89.1 :: Double) ^? _Latitude :: Maybe LatitudeBJust (Latitude (DegreesLatitude 89) (Minutes 5) (Seconds 60.0000))/(89.2 :: Double) ^? _Latitude :: Maybe LatitudeBJust (Latitude (DegreesLatitude 89) (Minutes 12) (Seconds 0.0000))Àfmap (\x -> _Latitude # x :: Double) (do deg <- (7 :: Int) ^? _DegreesLatitude; min <- (7 :: Int) ^? _Minutes; sec <- (7 :: Double) ^? _Seconds; (deg, min, sec) ^? _Latitude :: Maybe Latitude)Just 7.118611111111111Ãfmap (\x -> _Latitude # x :: Double) (do deg <- (89 :: Int) ^? _DegreesLatitude; min <- (15 :: Int) ^? _Minutes; sec <- (6 :: Double) ^? _Seconds; (deg, min, sec) ^? _Latitude :: Maybe Latitude)Just 89.25166666666667;QAn isomorphism on the triple of degrees latitude, minutes, seconds to a latitude.™do deg <- (7 :: Int) ^? _DegreesLatitude; min <- (7 :: Int) ^? _Minutes; sec <- (7 :: Double) ^? _Seconds; (deg, min, sec) ^? _Latitude :: Maybe Latitude@Just (Latitude (DegreesLatitude 7) (Minutes 7) (Seconds 7.0000))œdo deg <- (89 :: Int) ^? _DegreesLatitude; min <- (59 :: Int) ^? _Minutes; sec <- (59 :: Double) ^? _Seconds; (deg, min, sec) ^? _Latitude :: Maybe LatitudeCJust (Latitude (DegreesLatitude 89) (Minutes 59) (Seconds 59.0000))šdo deg <- (-7 :: Int) ^? _DegreesLatitude; min <- (7 :: Int) ^? _Minutes; sec <- (7 :: Double) ^? _Seconds; (deg, min, sec) ^? _Latitude :: Maybe LatitudeCJust (Latitude (DegreesLatitude (-7)) (Minutes 7) (Seconds 7.0000))do deg <- (-89 :: Int) ^? _DegreesLatitude; min <- (59 :: Int) ^? _Minutes; sec <- (59 :: Double) ^? _Seconds; (deg, min, sec) ^? _Latitude :: Maybe LatitudeFJust (Latitude (DegreesLatitude (-89)) (Minutes 59) (Seconds 59.0000))œdo deg <- (90 :: Int) ^? _DegreesLatitude; min <- (59 :: Int) ^? _Minutes; sec <- (59 :: Double) ^? _Seconds; (deg, min, sec) ^? _Latitude :: Maybe LatitudeNothingœdo deg <- (89 :: Int) ^? _DegreesLatitude; min <- (60 :: Int) ^? _Minutes; sec <- (59 :: Double) ^? _Seconds; (deg, min, sec) ^? _Latitude :: Maybe LatitudeNothingœdo deg <- (89 :: Int) ^? _DegreesLatitude; min <- (59 :: Int) ^? _Minutes; sec <- (60 :: Double) ^? _Seconds; (deg, min, sec) ^? _Latitude :: Maybe LatitudeNothingqfmap (\x -> _Latitude # x :: (DegreesLatitude, Minutes, Seconds)) ((7 :: Double) ^? _Latitude :: Maybe Latitude)1Just (DegreesLatitude 7,Minutes 0,Seconds 0.0000)tfmap (\x -> _Latitude # x :: (DegreesLatitude, Minutes, Seconds)) ((7.12 :: Double) ^? _Latitude :: Maybe Latitude)2Just (DegreesLatitude 7,Minutes 7,Seconds 12.0000) <=>?:;@ <=>?:;@None !"3457IN1Build a coordinate from a latitude and longitude. jBuild a coordinate from a fractional latitude and fractional longitude. Fails if either are out of range.!A BC!"#$%DEFGHIJKLMNOPQRSTUVW  !"#$% !"#$ %A BC!"#$%DEFGHIJKLMNOPQRSTUVWNone&  !"#$%X      !"#$%&'()*+,-./0 123456789:;<=>?"@ABC'DEFGHIJKLMNOPQRSTUVWXYZcoord_1Pl4eeJ29oE1ull59YQVHCData.Geo.Coordinate.SecondsData.Geo.Coordinate.Minutes$Data.Geo.Coordinate.DegreesLongitudeData.Geo.Coordinate.Longitude#Data.Geo.Coordinate.DegreesLatitudeData.Geo.Coordinate.LatitudeData.Geo.Coordinate.CoordinateData.Geo.Coordinate AsSeconds_SecondsSeconds modSeconds AsMinutes_MinutesMinutes modMinutesAsDegreesLongitude_DegreesLongitudeDegreesLongitudemodDegreesLongitudeantipodeDegreesLongitude AsLongitude _Longitude Longitude modLongitudeantipodeLongitudeAsDegreesLatitude_DegreesLatitudeDegreesLatitudemodDegreesLatitudeantipodeDegreesLatitude AsLatitude _LatitudeLatitude modLatitudeantipodeLatitude AsCoordinate _Coordinate Coordinate.#.<°>latitudeMinuteslatitudeSecondslongitudeMinuteslongitudeSecondsantipode$fAsSecondspfDouble $fShowSeconds$fAsSecondspfSeconds$fAsMinutespfInt$fAsMinutespfMinutes$fAsDegreesLongitudepfInt&$fAsDegreesLongitudepfDegreesLongitude$fAsLongitudepfDouble$fAsLongitudepf(,,)$fAsSecondspfLongitude$fAsMinutespfLongitude$fAsDegreesLongitudepfLongitude$fAsLongitudepfLongitude$fAsDegreesLatitudepfInt$$fAsDegreesLatitudepfDegreesLatitude$fAsLatitudepfDouble$fAsLatitudepf(,,)$fAsSecondspfLatitude$fAsMinutespfLatitude$fAsDegreesLatitudepfLatitude$fAsLatitudepfLatitudecoordinatePrism'coordinatePrism$fAsSecondspfCoordinate$fAsMinutespfCoordinate $fAsDegreesLongitudepfCoordinate$fAsLongitudepfCoordinate$fAsDegreesLatitudepfCoordinate$fAsLatitudepfCoordinate$fAsCoordinatepf(,)$fAsCoordinatepf(,)0$fAsCoordinatepf(,)1$fAsCoordinatepf(,)2$fAsCoordinatepf(,)3$fAsCoordinatepf(,)4$fAsCoordinatepf(,)5$fAsCoordinatepf(,)6$fAsCoordinatepf(,)7$fAsCoordinatepf(,)8$fAsCoordinatepf(,)9$fAsCoordinatepf(,)10$fAsCoordinatepf(,)11$fAsCoordinatepfCoordinate