簡體   English   中英

在Haskell中創建Fractional類型類的實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM