簡體   English   中英

為什么編譯器在以下haskell代碼上給出錯誤?

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

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