2012-10-29 8 views
5

私は測地計算のためのライブラリを作成しています。私が含めることの1つは、グリッド投影(例えば、陸上測量ナショナルグリッド)のタイプとそれらのグリッド上のポイント( "eastings"と "northings"で指定)です。グリッドは、地球とそれを幾何学的パラメータの束に結びつける原点によって指定されます。アプリケーションプログラマは、これらのパラメータを使用して多くの任意のグリッドを作成できます。また、さまざまな基礎的な予測に基づいて、さまざまな種類のグリッドが作成されます。タイプを使用して互換性のない値を分離する方法

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

私はまた、下にある楕円体の測地位置(緯度&経度)にも同様の問題があります。しかし、グリッド・バージョンは、この問題の焦点が測地学ではなくタイプ・システムであるため、おそらく説明が簡単です。

私はGADTと実存型を読みましたが、これを行う方法はわかりません。

+0

算術演算でこれを行う方法があります:http://www.haskell.org/haskellwiki/Type_arithmetic – Wes

+0

"しかし同時に、アプリケーションプログラマが要求しないようにHaskell型システムを使用したい異なるグリッド上の2点間の距離 " - それはなぜですか?ポイントは異なるグリッド上で定義されても同じ_物理的な位置を表しますが、そのようなポイント間の距離の計算を許可しないのはなぜですか? – leftaroundabout

+0

@leftaroundabout:はい、それには座標変換とより複雑な計算が必要です。また場合によっては、単純な平面計算が右のもの(例えば、レーダーを扱う場合)です。 –

答えて

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+ではない働いています。)

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

今すぐdistance zeroZero (Coord 1 2 :: Coordinate OSNG)は型エラーを与える:次に、それを必要とするすべての機能がgridファントムパラメータの平等を強制することができます。

+0

これを正しく理解すれば、CoordinateType値のハードコーディングされたリストに対してのみ機能します(もっと冗長ではありますが、タイプクラスを使用して実際に行っています)。 "foo = Grid 3 4; bar = Grid 2 4.2"は "foo"の座標と "bar"の座標を型レベルで区別できるように、 "data CoordType = Grid Double Double" –

+0

@PaulJohnsonでは、あなたはハードコードされた値のリストに制限されていません。6)あなたは文字列とナチュラルを型レベルで使うことができます( "昇進したリテラル")。データ - >親切な宣伝に関するドキュメントは、[here](http://www.haskell.org/ghc/docs/7.6.1/html/users_guide/promotion.html)でご覧いただけます。 – huon

+0

でも、文字列でなければなりません。ファイルから文字列を読み込み、型に昇格することはできません。 –

関連する問題