我正在编写一个用于大地测量计算的库。我想要包括的一件事是网格投影的类型(例如军械测量国家网格)和这些网格上的点(由“东线”和“北线”指定)。网格由将其与地球联系起来的原点和一组几何参数指定。应用程序程序员可以使用这些参数创建许多任意网格。还将有一系列基于不同基础投影的网格类型。
显然,我希望能够对网格点(例如距离、方位等)进行计算,但同时我想使用 Haskell 类型系统来防止应用程序程序员询问不同网格上两点之间的距离。我想知道使用 ST monad 的类型参数的 Reader Monad 是否可以工作,但我希望应用程序程序员能够将这些位置值存储在 monad 之外,而 ST 完全是为了防止 STRefs 从runST。
对于底层椭球体上的大地测量位置(纬度和经度),我也遇到了类似的问题。但是网格版本可能更容易解释,因为这个问题的重点是类型系统而不是大地测量。
我已经阅读了 GADT 和存在类型,但我不知道如何做到这一点。