[英]why does the compiler give error on the following haskell code?
我正在嘗試研究haskell中的類型類。 我編寫以下腳本,並引發了錯誤。 我不明白為什么編譯器將v視為具體類型,而將其僅作為Boxer類的參數。
data Box1 a b = Box1 Double a [b]
class Boxer v where
foo :: (v a b) -> Double
instance Boxer (Box1 a b) where
foo (Box1 r s t) = r
它在第7:8行中引發錯誤:
Couldn't match type `v' with `Box1'
`v' is a rigid type variable bound by
the type signature for foo :: v a b -> Double at file1.hs:4:10
Expected type: v a b
Actual type: Box1 a b
Relevant bindings include
foo :: v a b -> Double (bound at file1.hs:7:3)
In the pattern: Box1 r s t
In an equation for `foo': foo (Box1 r s t) = r
Failed, modules loaded: none.
在您的實例中,編譯器必須使用Box1 ab
實例化v
。 特別是,它具有實例vab
喜歡的東西(Box1 ab) ab
-除了這兩個a
變量來自不同的地方; 實際上,它們已消除(Box1 ab) a1 b1
歧義。 與Box1 ab a1 b1
相同。
foo :: Box1 a b a1 b1 -> Double
這有任何意義嗎?
問題是您將一個(類型)函數 Box1
與將所述函數應用於某些類型參數的結果混淆了。 種類不匹配:
GHCi> :k Boxer
Boxer :: (* -> * -> *) -> Constraint
GHCi> :k (Box1 Int String)
Box1 Int String :: *
* -> * -> *
是一種類型函數/類型構造函數,帶有兩個參數,因此Boxer
需要的。 而Box1 ab
只是一種類型,沒有參數。 不匹配! 太太
GHCi> :k Box1
Box1 :: * -> * -> *
特殊的問題是由於縮進不當引起的。 盡管還有另一件事我做錯了。 因此,編譯了以下版本:
data Box1 a b = Box1 Double a [b]
class Boxer v where
foo :: (v a b) -> Double
instance Boxer Box1 where
foo (Box1 r s t) = r
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.