9

VectorHaskellで数学モジュールを作成しました。

だから私はから始めました:

data Vector a = Vector !a !a !a deriving (Eq, Show)

これで、任意の数値データ型を使用できます。問題は、書く必要がないという単純な理由で、どこにいDoubleても書きたくないということです。Vector Doubleだから私は追加します:

type Scalar = Double
type Vector = Vector Scalar

しかし、もちろん、2 行目の宣言は間違っていVectorます。では、何に変更すればよいのでしょうか。いいえ、コード全体にこれを書くつもりなので、型エイリアスをそのままにしておきたいと思いVectorます。つまり、データ型名を変更する必要があります。しかし、それを変更すると、コンストラクターも変更する必要があるように感じます。これにより、すべてがさらに混乱します。ただし、コンストラクターを型エイリアスと同じ名前にするのが面倒な場合は、このようにします。

今私はこれを持っています:

type Scalar = Double
type Vector = VectorT Scalar

data VectorT a = Vector !a !a !a deriving (Eq, Show)

私は恣意的に選んだT(「タイプ」の略だと思います)が、これについてはよくわかりません。通常、関数を文書化するときは と言う-- Calculate the magnitude of a Vectorのですが、実際にはその型名VectorTを使用する必要があると感じています。したがって、すべてのデータ型のすべてのコメントにこの規則を適用する必要があるように感じます。vectors

誰かが同様の状況にありましたか?この場合、よりエレガントなソリューションを考えられる人はいますか?

4

2 に答える 2

8

特定の問題に対する1つの解決策は、データ型を型シノニムとは異なるモジュールに置くことです。つまりMath.Vector、データ宣言といくつかの汎用関数 (つまり、すべての数値型で機能する関数) を含むモジュールを用意します。次に、コードで実際にVector Double多く使用する場合は、修飾されたインポートを使用して型シノニムを作成するだけです。

import qualified Math.Vector as MV

type Scalar = Double
type Vector = MV.Vector Scalar

これは、コード編成の観点から理にかなっていると思います。特に、Vectorすべての数値型で機能するように型を定義した場合、そのモジュールの関数もすべての数値型で機能することを期待しています。Vector Doubleコードの他の部分で多く使用するという事実は、Vector実際に定義されているモジュールに影響を与えるべきではありません。結局のところ、Vector Intプログラムのさらに別の部分でロットを使用することを想像するのは完全に理にかなっています。

余談ですが、それを呼び出すVectorのが最善のアイデアかどうかはわかりません。ベクトルは必ずしも 3 次元である必要はないので、データ型を のように呼びますVector3D。これは実際には他の API (Java 3D API など) で使用されている名前であるため、おそらく適切な選択です。

于 2012-07-08T09:56:37.217 に答える
2

ただやらない具体的な理由はありますか

data Vector = Vector !Double !Double !Double deriving (Eq, Show)

それは私にとって最も単純なアイデアのように思えます...

于 2012-07-09T09:09:18.420 に答える