当我尝试通过变量索引访问列表元素时,我收到错误:
Prelude> let x = 0
Prelude> let y = [1,2,3]
Prelude> y !! x
<interactive>:18:6:
Couldn't match expected type `Int' with actual type `Integer'
In the second argument of `(!!)', namely `x'
In the expression: y !! x
In an equation for `it': it = y !! x
问题似乎是0的类型是Num而x的类型是Integer,但我该如何解决这个问题呢? 我试图谷歌问题,但没有成功。
答案 0 :(得分:6)
这里的问题是GHCi在默认值类型方面更具攻击性。只需指定类型签名,您就可以了:
> let x = 0 :: Int
> let y = [1, 2, 3]
> y !! x
1
这是由Monomorphism restriction引起的。这里有几十个答案,详细解释了它,并在该链接中有一个非常完整的解释。
答案 1 :(得分:1)
x
不是Int
,这是!!
所采用的类型。解决方案:
let x = 0 :: Int
let y = [1, 2, 3]
y !! x
答案 2 :(得分:1)
声明x时,您可以尝试使用:
let x = 0 :: Int
要强制它为int类型,那么y !! x应该工作