我有一個三維矢量數據類型定義爲3浮點數。我知道如果我爲我的課程提供一個Num
實例並定義正常的數學運算符,我可以在課堂上使用它們。爲什麼總和需要GHC.Num.fromInteger?
data Vec3 = Vec3 { x :: Float
, y :: Float
, z :: Float
} deriving (Show, Eq)
instance Num Vec3 where
(+) v1 v2 = Vec3 (x v1 + x v2) (y v1 + y v2) (z v1 + z v2)
當我將文件加載到ghci中,我得到警告,因爲我沒有Num
定義所有的功能,這是有道理的。
Prelude> :l temp.hs
[1 of 1] Compiling Main (temp.hs, interpreted)
temp.hs:6:10: Warning:
No explicit method or default declaration for `*'
In the instance declaration for `Num Vec3'
temp.hs:6:10: Warning:
No explicit method or default declaration for `abs'
In the instance declaration for `Num Vec3'
temp.hs:6:10: Warning:
No explicit method or default declaration for `signum'
In the instance declaration for `Num Vec3'
temp.hs:6:10: Warning:
No explicit method or default declaration for `fromInteger'
In the instance declaration for `Num Vec3'
Ok, modules loaded: Main.
但是,我仍然可以使用我定義的那些。想爲什麼和需要fromInteger
定義爲我的Vec3
數據類型使用SUM函數
*Main> sum [a,b]
Vec3 {x = *** Exception: temp.hs:6:10-17: No instance nor default method for class operation GHC.Num.fromInteger
時
*Main> let a = Vec3 1.0 2.0 3.0
*Main> let b = Vec3 2.0 4.0 5.0
*Main> a + b
Vec3 {x = 3.0, y = 6.0, z = 8.0}
我的困惑來自於以下幾個錯誤我得到什麼?首先,我會認爲這筆款項只使用+
函數,而另一方面,我的數據類型不使用Integer
。
在將數據類型視爲類的實例之前,應始終在最小完整定義中定義** all **操作... – Bakuriu
這裏真正的問題在於,即使向量不是數字,您也會使'Vec3'成爲'Num'的一個實例。 – rightfold
要擴展@rightfold - 不要僅僅因爲你想要+向量而創建Num的實例,即使向量上使用的某些操作符傾向於與數字操作符具有相同的名稱,向量也不是數字。 (儘管你可以將矢量當作數字來處理,如果用'矢量',你只是指「固定大小的數字集合」,而不是幾何或物理意義上的矢量)。 – Cubic