簡體   English   中英

Haskell:GHCI中錯誤的含義

[英]Haskell: meaning of the error in GHCI

我無法弄清楚此錯誤消息的含義。 我想為下面的數據類型定義函數距離...我不想使用任何GHC擴展..即使代碼很丑,在繼續使用擴展之前,我還是想更好地理解錯誤。 有人可以讓我知道此錯誤的含義以及如何消除此錯誤。

class Vector v where

         distance :: v -> v -> Double

-- doesn't make sense, but WTH...    
newtype OneD1 a = OD1 a
         deriving (Show)

instance Vector (Maybe m) where
    distance _ _ = 5.6

instance Vector (OneD1 m) where
   distance (OD1 x1) (OD1 x2) = x2-x1

    Prelude> :reload
[1 of 1] Compiling Main             ( VectorTypeClass.hs, interpreted )

VectorTypeClass.hs:33:33:
    Couldn't match expected type `Double' with actual type `m'
      `m' is a rigid type variable bound by
          the instance declaration
          at C:\Users\byamm\Documents\Programming\Haskell\Lab\Expts\VectorTypeClass\VectorTypeClass.hs:32:10
    Relevant bindings include
      x2 :: m
        (bound at C:\Users\byamm\Documents\Programming\Haskell\Lab\Expts\VectorTypeClass\VectorTypeClass.hs:33:27)
      x1 :: m
        (bound at C:\Users\byamm\Documents\Programming\Haskell\Lab\Expts\VectorTypeClass\VectorTypeClass.hs:33:18)
      distance :: OneD1 m -> OneD1 m -> Double
        (bound at C:\Users\byamm\Documents\Programming\Haskell\Lab\Expts\VectorTypeClass\VectorTypeClass.hs:33:4)
    In the first argument of `(-)', namely `x2'
    In the expression: x2 - x1
Failed, modules loaded: none.
Prelude>
instance Vector (OneD1 m) where

對於任何m ,這都保證(OdeD1 m)是一個向量。 包括OneD1 String等。

   distance (OD1 x1) (OD1 x2) = x2-x1

在這里,我們嘗試在兩個類型為m值上應用-絕對可以。 這里有兩個問題:

  • m可能不是數字類型-GHC目前未報告此錯誤。
  • 求和的結果還是類型m ,但是距離應該產生Double 這是GHC報告的錯誤。

您需要將m限制為某種數字類型,以便可以使用- ,並且該類型必須允許轉換為Double ,否則您將無法滿足distance簽名。

一種簡單的方法是:

instance Vector (OneD1 Double) where
   distance (OD1 x1) (OD1 x2) = x2-x1

另一個可能是:

instance Real m => Vector (OneD1 m) where
   distance (OD1 x1) (OD1 x2) = realToFrac (x2-x1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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