Piszę bibliotekę do obliczeń geodezyjnych. Jedną rzeczą, którą chcę uwzględnić, jest typ do rzutowania siatki (na przykład Krajowa siatka badania Ordnance Survey) i punkty na tych siatkach (określone przez "wschody" i "północy"). Siatka jest określona przez punkt początkowy, który wiąże ją z Ziemią i wiązkę parametrów geometrycznych. Programista aplikacji może tworzyć wiele arbitralnych sieci przy użyciu tych parametrów. Pojawi się także szereg rodzajów sieci bazujących na różnych projekcjach podstawowych.Jak używać typów do rozdzielania niezgodnych wartości
Oczywiście chcę mieć możliwość wykonywania obliczeń na punktach siatki (np. Odległość, łożysko itp.), , ale jednocześnie chcę użyć systemu typu Haskell, aby uniemożliwić programistom żądanie odległości między dwoma punkty na różnych siatkach. Zastanawiałem się, czy Monada Reader używająca parametru typu wzdłuż linii monady ST będzie działała, ale chcę, żeby programista mógł przechowywać te wartości pozycji poza monadą, podczas gdy ST chodzi o zapobieganie przeciekom z STRefs. runST.
Mam również podobny problem z położeniami geodezyjnymi (szerokość geograficzna & długości geograficznej) na leżących poniżej elipsoidach. Ale wersja siatkowa jest prawdopodobnie łatwiejsza do wytłumaczenia, zważywszy, że głównym tematem tego pytania jest system typu, a nie geodetyka.
Czytałem o GADT i typach egzystencjalnych, ale nie widzę, jak to zrobić.
Może to być sposób na arytmetykę typu: http://www.haskell.org/haskellwiki/Type_arithmetic – Wes
"ale jednocześnie chcę użyć systemu typu Haskell, aby uniemożliwić programistom żądanie pytania odległość między dwoma punktami na różnych siatkach "- dlaczego tak jest? Punkty mogą być zdefiniowane na różnych siatkach i nadal reprezentują tę samą lokalizację _physical_, dlaczego nie chcesz pozwolić na obliczenie odległości między takimi punktami? – leftaroundabout
@leftaroundabout: tak, ale to wymaga transformacji współrzędnych i bardziej złożonych obliczeń. Również w niektórych przypadkach proste obliczenia planarne są właściwe (np. W przypadku radarów). –