使用 Integer 作为参数时出现非法类型错误

Illegal type error when using Integer as argument

尝试做 99 题的初学者。这是我解决第三个问题的尝试(是):

elementAt :: [a] -> Int -> Maybe a
elementAt _ x | x <= 0 = Nothing
elementAt [] x | x > 0 = Nothing
elementAt (x: _) 1 = Just x
elementAt (_: xs) x | x > 1 = elementAt xs (x-1)

testElementAt :: IO ()
testElementAt = do
    print (elementAt []::[Int] 5)
    print (elementAt []::[Int] 0)
    print (elementAt [1, 2, 3] 2)
    print (elementAt [1, 2, 3] 5)
    print (elementAt [1, 2, 3] 1)
    print (elementAt [1, 2, 3] 0)

main :: IO ()
main = do
    testElementAt

错误信息:

error:
    Illegal type: ‘5’ Perhaps you intended to use DataKinds
        print (elementAt []::[Int] 5)
                                   ^

我想这与5既可以是Int又可以是Float有关? (就像 [] 一样,我必须用 ::[Int] 键入它才能通过编译器?)但是,同样的技巧似乎不起作用。

我该怎么办?

5 是类型签名的一部分。如果你想指定列表的类型,你可以这样做:

print (elementAt <strong>(</strong>[] :: [Int]<strong>)</strong> 5)

这里我们给出了一个类型提示,即空列表是 Int 的列表。因此,本例中的 5 被视为第二个参数。