さまざまな次元のベクトル量の数値積分をモデル化してみようと考え、型クラスが最適であると考えました。2 つの値の差を定義し、(導関数を取得するために) 乗数でスケーリングし、距離関数を取得できるようにする必要がありました。
これまでのところ、私は持っています:
class Integratable a where
difference :: a -> a -> a
scale :: Num b => a -> b -> a
distance :: Num b => a -> a -> b
data Num a => Vector a = Vector1D a | Vector2D a a
instance Num a => Integratable (Vector a) where
difference (Vector1D x1) (Vector1D x2) = Vector1D (x1 - x2)
scale (Vector1D x) m = Vector1D (x * m)
distance (Vector1D x1) (Vector1D x2) = x1 - x2
difference (Vector2D x1 y1) (Vector2D x2 y2) = Vector2D (x1 - x2) (y1 - y2)
scale (Vector2D x y) m = Vector2D (x * m) (y * m)
distance (Vector2D x1 y1) (Vector2D x2 y2) = sqrt((x1-x2)*(x1-x2)
+ (y1-y2)*(y1-y2))
残念ながら、解決方法がわからない問題がいくつかあります。まず、scale
関数でエラーが発生します。GHCはそれを伝えることができず、互換性がm
あります.1つのケースではインスタンスでx
厳格な型制限Num
が与えられ、Vector
別のケースでは型で与えられているためです...それを指定して同じ型にする方法はありますx
かm
?
x
(実際には、とm
が両方ともであっても、同じNum
ではない可能性があることに気付きました。どうすればこれを指定できますか? でわからない場合は、 を使用しても問題ありませんが、むしろ一般的なままにしておきます。) Num
Num
Double
にも同様の問題がありdistance
ます。と互換性のある値が含まれるNum
インスタンス定義で判断できないため、戻り値の型を に指定しようとすると失敗します。a
b