Ich schreibe eine Bibliothek für geodätische Berechnungen. Eine Sache, die ich einbeziehen möchte, ist ein Typ für Rasterprojektionen (z. B. Ordnance Survey National Grid) und Punkte auf diesen Rastern (angegeben durch "eastings" und "northings"). Ein Gitter wird durch einen Ursprungspunkt, der es mit der Erde verbindet, und durch eine Menge geometrischer Parameter spezifiziert. Der Anwendungsprogrammierer kann mithilfe dieser Parameter viele beliebige Raster erstellen. Es wird auch eine Reihe von Gittertypen geben, die auf verschiedenen zugrunde liegenden Projektionen basieren.Wie verwende ich Typen, um inkompatible Werte zu trennen
Offensichtlich möchte ich in der Lage sein, Berechnungen auf Rasterpunkten (zB Entfernung, Peilung usw.), zu machen, aber gleichzeitig möchte ich das Haskell-System verwenden, um zu verhindern, dass ein Anwendungsprogrammierer nach dem Abstand zwischen zwei fragt Punkte auf verschiedenen Gittern. Ich fragte mich, ob ein Reader Monad, der einen Typparameter entlang der ST-Monade verwendet, funktionieren würde, aber ich möchte, dass der Anwendungsprogrammierer diese Positionswerte außerhalb der Monade speichern kann, während es bei ST darum geht, das Lecken von STRefs zu verhindern das runST.
Ich habe auch ein ähnliches Problem mit geodätischen Positionen (Breitengrad & Länge) auf den zugrunde liegenden Ellipsoiden. Aber die Grid-Version ist wahrscheinlich leichter zu erklären, da der Schwerpunkt dieser Frage eher auf dem Typensystem als auf Geodäten liegt.
Ich habe GADTs und existentielle Typen gelesen, aber ich kann nicht sehen, wie man das macht.
Könnte ein Weg sein, dies mit arithmetischen Typ zu tun: http://www.haskell.org/haskellwiki/Type_arithmetic – Wes
"aber gleichzeitig möchte ich das Haskell-Typ-System verwenden, um zu verhindern, dass ein Anwendungsprogrammierer fragt der Abstand zwischen zwei Punkten auf verschiedenen Gittern "- warum ist das? Punkte können auf verschiedenen Gittern definiert werden und stellen immer noch den gleichen physikalischen Ort dar. Warum sollten Sie nicht die Entfernung zwischen diesen Punkten berechnen lassen? – leftaroundabout
@leftaroundabout: Ja, aber das erfordert eine Koordinatentransformation und komplexere Berechnungen. Auch in einigen Fällen ist die einfache planare Berechnung die richtige Sache (z. B. wenn es sich um Radare handelt). –