这似乎是一个非常常见的操作,但由于某种原因我在 hoogle 中找不到它。无论哪种方式,这都是一个有趣的思考练习。我天真的实现:
pluckL :: [a] -> Int -> Maybe ( a, [a] )
pluckL xs idx = if idx < length xs then Just $ pluck' xs idx else Nothing
where
pluck' l n = let subl = drop n l in ( head subl, rest l n ++ tail subl )
rest l n = reverse $ drop ( length l - n ) $ reverse l
我的主要抱怨是我翻转列表太多次,所以我正在寻找一种创造性的方式,你可以遍历列表一次并生成元组。