![](/img/trans.png)
[英]Creating a typeclass that returns another instance of that typeclass in haskell
[英]Creating an instance of the Fractional Typeclass in Haskell
我是一個自學成才的Haskell愛好者,我正在構建一個名為Physical的新類型,我可以使用它來表示物理量。 它使用兩個Float分別表示物理量的值及其不確定性。
data Physical = Physical {
value :: Float,
err :: Float
}
我使用標准規則來計算總和,差異的不確定性和兩個量的乘積來定義Num類型類的實例。
instance Num Physical where
(Physical v1 u1) + (Physical v2 u2) = (Physical (v1+v2) (u1+u2))
(Physical v1 u1) - (Physical v2 u2) = (Physical (v1-v2) (u1+u2))
(Physical v1 u1) * (Physical v2 u2) = (Physical (v1*v2) (sqrt((u1 /v1)^2 + (u2 /v2)^2)*v1*v2))
到目前為止,我沒有遇到代碼工作。 但是,當我試圖使像這樣的物理 分數的實例
instance Fractional Physical where
(Physical v1 u1) / (Physical v2 u2) = (Physical (v1 / v2) (sqrt((u1 /v1)^2 + (u2 /v2)^2)*(v1 /v2)))
加載我的代碼時出現錯誤,說明我的代碼(Main./)中的(/)與Prelude(Prelude./)導出的(/)之間存在模糊不清的地方,無論我在我的代碼中使用(/),特別是在分數的物理實例的定義中。
Physical.hs:23:19:
Ambiguous occurrence `/'
It could refer to either `Main./', defined at Physical.hs:15:18
or `Prelude./',
imported from `Prelude' at Physical.hs:1:1
(and originally defined in `GHC.Real')
這使我非常困惑,因為運算符(+)的出現不存在問題,因為我使用它來創建Num中的Physical實例與使用(/)創建Physical實例的方式相同在分數。
缺少縮進。 縮進你的代碼。
instance Fractional Physical where
(Physical v1 u1) / (Physical v2 u2) = (Physical (v1 / v2) (sqrt((u1 /v1)^2 + (u2 /v2)^2)*(v1 /v2)))
instance Fractional Physical where
(Physical v1 u1) / (Physical v2 u2) = (Physical (v1 / v2) (sqrt((u1 /v1)^2 + (u2 /v2)^2)*(v1 /v2)))
-- even a single space would be ok
您實際上定義了一個新的頂級(/)
。 您的實際Fractional
實例為空。 如果不是出於模糊不清的情況,您將收到沒有明確實現的警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.