使用 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
被视为第二个参数。
尝试做 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
被视为第二个参数。