さまざまな次元のベクトル量の数値積分をモデル化してみようと考え、型クラスが最適であると考えました。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ではない可能性があることに気付きました。どうすればこれを指定できますか? でわからない場合は、 を使用しても問題ありませんが、むしろ一般的なままにしておきます。) NumNumDouble
にも同様の問題がありdistanceます。と互換性のある値が含まれるNumインスタンス定義で判断できないため、戻り値の型を に指定しようとすると失敗します。ab