哈斯克尔:!!运算符变量

时间:2014-05-28 17:33:04

标签: haskell

当我尝试通过变量索引访问列表元素时,我收到错误:

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,但我该如何解决这个问题呢? 我试图谷歌问题,但没有成功。

3 个答案:

答案 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应该工作