これは非常に一般的な操作のようですが、何らかの理由で 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
私の主な不満は、リストを何度もめくっていることです。そのため、リストを 1 回トラバースしてタプルを生成できる創造的な方法を探しています。