1
在下面的Haskell代碼中,函數typeError不會檢查類型。Haskell函數組成 - 錯誤推斷類型
wrap x = [x]
listf :: [[a]] -> [[a]]
listf = id
typeCheck :: [a] -> [[a]]
typeCheck x = listf (wrap x)
typeError :: [a] -> [[a]]
typeError = wrap . listf
GHC產生這個錯誤,如果它是未註釋:
Couldn't match type `a' with `[a0]'
`a' is a rigid type variable bound by
the type signature for typeError :: [a] -> [[a]] at tim.hs:10:1
Expected type: [a] -> [a]
Actual type: [[a0]] -> [[a0]]
In the second argument of `(.)', namely `listf'
In the expression: wrap . listf
我不明白爲什麼。 a
應該能夠與[a0]
一致 - 它們是獨立的類型變量。這正是它爲typeCheck
推斷的類型 - 但在使用.
運算符時不適用。
擁抱產生非常相似的,並且類似地雜散,錯誤消息:
ERROR "repro.hs":10 - Inferred type is not general enough
*** Expression : typeError
*** Expected type : [a] -> [[a]]
*** Inferred type : [[a]] -> [[[a]]]
此外,該正常工作:
listf' :: [a] -> [a]
listf' = id
typeCheck' :: [a] -> [[a]]
typeCheck' = wrap . listf'
該問題只與[[一個]或發生[ [[a]]]或更高。這裏的交易是什麼?
該死的,這就是我在嘗試修復這個代碼中的一個錯誤後得到的,經過多年的不做Haskell ..謝謝。 – banana