5

測地計算用のライブラリを作成しています。私が含めたいことの 1 つは、グリッド投影 (Ordnance Survey National Grid など) のタイプと、それらのグリッド上のポイント ("eastings" と "northings" で指定) です。グリッドは、それを地球に結び付ける原点と一連の幾何学的パラメーターによって指定されます。アプリケーション プログラマは、これらのパラメータを使用して多くの任意のグリッドを作成できます。また、さまざまな基本的な予測に基づいて、さまざまな種類のグリッドが存在する予定です。

グリッド ポイント (距離、方位など) で計算を実行できるようにしたいのは明らかですが、同時に、Haskell 型システムを使用して、アプリケーション プログラマーが異なるグリッド上の 2 点間の距離を要求しないようにしたいと考えています。ST モナドに沿って型パラメーターを使用する Reader モナドが機能するかどうか疑問に思いましたが、アプリケーション プログラマーがこれらの位置の値をモナドの外に格納できるようにしたいと考えています。 runST。

基になる楕円体の測地位置 (緯度と経度) にも同様の問題があります。しかし、この質問の焦点が測地学ではなく型システムであることを考えると、グリッドバージョンはおそらく説明が簡単です。

GADT と実在型について読みましたが、これを行う方法がわかりません。

4

1 に答える 1

2

2 つの GHC 拡張機能を使用して、元のグリッドで座標をマークできるようにすることができます。

{-# LANGUAGE DataKinds, KindSignatures #-}

data CoordinateType = Geodetic | OSNG -- etc.

data Coordinate (grid :: CoordinateType) = Coord Int Int

zeroZero :: Coordinate Geodetic
zeroZero = Coord 0 0

(拡張機能は GHC 7.4+ で動作しますが、それより低いものについては不明です。)

次に、それを必要とする関数は、gridファントム パラメーターの等価性を強制できます。

distance :: Coordinate grid -> Coordinate grid -> Float
distance p q = undefined

distance zeroZero (Coord 1 2 :: Coordinate OSNG)型エラーが発生するようになりました。

于 2012-10-29T11:36:49.977 に答える