我想我会尝试对不同维度的向量进行一些数值积分建模,并认为类型类是要走的路。我需要一些东西来定义两个值之间的差异并通过乘数对其进行缩放(以获得导数),以及能够采用距离函数。
到目前为止,我有:
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
并且是兼容的,因为在一种情况下在实例中给出x
了严格的类型限制,在另一种情况下在类型中给出......有没有办法指定它并且是相同的类型?Num
Vector
x
m
(事实上,我意识到即使x
和m
都是Num
,它们也可能不一样 Num
。我该如何指定这个?如果我无法用 来弄清楚Num
,使用Double
会很好,但我宁愿保持一般性。)
有一个类似的问题distance
。尝试指定返回类型Num
失败,因为它无法在实例定义中说明a
将包含与b
.