【发布时间】:2016-10-30 15:45:13
【问题描述】:
我有一个关于head、tail、init 和last 的问题。
以下在 GHCi 中起作用:
Prelude Data.List Data.Char> let n = [1..10] in (head n : tail n)
[1,2,3,4,5,6,7,8,9,10]
不出所料,我得到了整个列表。所以这也适用于init 和last,
对吧?
Prelude Data.List Data.Char> let n = [1..10] in (init n : last n)
<interactive>:39:1:
Non type-variable argument in the constraint: Enum [[a]]
(Use FlexibleContexts to permit this)
When checking that ‘it’ has the inferred type
it :: forall a. (Enum a, Enum [[a]], Num a, Num [[a]]) => [[a]]
如果我查看函数的类型签名,那么 head 和 last
看起来一样——它们都返回一个元素。还有init 和tail 看
相同,因为它们都返回列表。
Prelude Data.List Data.Char> :info head
head :: [a] -> a -- Defined in ‘GHC.List’
Prelude Data.List Data.Char> :info tail
tail :: [a] -> [a] -- Defined in ‘GHC.List’
Prelude Data.List Data.Char> :info init
init :: [a] -> [a] -- Defined in ‘GHC.List’
Prelude Data.List Data.Char> :info last
last :: [a] -> a -- Defined in ‘GHC.List’
那么Non type-variable argument in the constraint: Enum [[a]] 是什么意思?
如果我在不构建新列表的情况下执行init n 或last n,我会得到
[1..9] 和 10。
【问题讨论】:
-
无法删除评论?!
-
这是一个绝对可怕的错误信息。类型检查器首先遇到了一个更微妙的问题并报告了它而不是真正的点。
标签: list haskell types ghci type-constraints