我试着在google上查找Int -> [a] -> Maybe a
,但是没有运气。
我觉得这应该在标准库的某个地方,但我不知道在哪里。
有一个库叫做Safe on Hackage,它包含一个函数:
atMay :: [a] -> Int -> Maybe a
在标准库中没有(虽然会很好),但这里有一种实现它的方法(也适用于无限列表):
(!!!) :: [a] -> Int -> Maybe a
[] !!! _ = Nothing
(x:xs) !!! n
| n < 0 = Nothing
| n == 0 = Just x
| otherwise = xs !!! (n-1)
这种函数的可能定义(主要是从(!!)
的定义中窃取的):
xs !!! n | n < 0 = Nothing
[] !!! _ = Nothing
(x:_) !!! 0 = Just x
(_:xs) !!! n = xs !!! (n-1)
(!!!) :: [a] -> Int -> Maybe a
xs !!! n = Maybe.listToMaybe $ drop n xs