Для людей, интересующихся этой темой: принятый ответ включает некоторые концепции, которые, как мне кажется, хорошо описаны здесь. А именно, различия между ключевыми словами
data
,newtype
иinstance
и способами их использования.
Я начал изучать Haskell, как неделю назад (из Python и С#), и я хочу реализовать класс GeographicPosition
, который хранит широту, долготу и высоту.
В частности, я хотел бы сделать это в самом элегантном, функциональном, "единица измерения", осознанном образом.
Если взять, например, X, Y и Z в декартовом ( "прямоугольном" ) пространстве, все они означают одно и то же, имеют один и тот же диапазон (от -inf
до +inf
), будучи ортогональным и однородным.
Теперь с широтой, долготой и высотой это не так. Долгота, например, является периодической, широта имеет некоторую максимальную хитрость на полюсах (которые сами по себе являются особенностями), а высота имеет минимальное абсолютное значение в центре земли (другая особенность).
Различия друг от друга, очевидно (по крайней мере для меня), что они не "одно и то же", в том смысле, что X, Y и Z "одно и то же" в декартовой системе. Я не могу просто перевернуть начало и притворяться, что Широта теперь долгота в том смысле, что я могу притворяться, что X теперь Y, и такой.
Итак, вопрос:
Должны ли широта, долгота и высота иметь собственный численный тип в типе, представляющем географическое положение в Haskell? Что было бы хорошей сигнатурой типа для этого (минимальный образец кода был бы замечательным)
Я бы представлял себе что-то вроде
data Position = Position { latitude :: Latitude,
longitude :: Longitude,
elevation :: Elevation }
вместо более очевидного, позиционного
data Position = Position RealFloat RealFloat RealFloat
но я не знаю, какой стиль более рекомендуется. Похоже, что Bounded
тоже интересная конструкция, но я не совсем понял, как ее использовать в этом случае.