Получить подсписок в Haskell
Вероятно, легкий, но я просмотрел документы и искал Google для примеров, и я все еще не уверен в ответе.
Если у меня есть список вроде этого:
[1,2,3,4,5,6,7,8,9,0]
и я хочу извлечь фрагмент, скажем, из индекса 4 в индекс 8, то есть я хочу:
[5,6,7,8,9]
Что такое идиоматический способ сделать это в Haskell?
Ответы
Ответ 1
Прежде всего, это не массив, это список. Я не являюсь (просто) педантичным, так как массивы гораздо более проблематичны в Haskell, чем списки.
Тем не менее, один общий способ - использовать take
и drop
вместе:
Prelude> drop 4 . take 9 $ [1,2,3,4,5,6,7,8,9,0]
[5,6,7,8,9]
Prelude> take (9-4) . drop 4 $ [1,2,3,4,5,6,7,8,9,0]
[5,6,7,8,9]
Последнее немного более эффективно.
Ответ 2
> drop 4 (take 9 [1,2,3,4,5,6,7,8,9,0])
[5,6,7,8,9]
Ответ 3
Вам может быть интересно Data.Vector(slice).
ghci> import Data.Vector
ghci> let v = fromList [1..10]
ghci> v
fromList [1,2,3,4,5,6,7,8,9,10]
ghci> slice 4 5 v
fromList [5,6,7,8,9]
Обратите внимание, что slice
в Data.Vector
принимает в качестве входных данных начальный индекс и длину среза.
Ответ 4
Хммм, не очень практично, но, возможно, его можно улучшить?
(\(x,y) -> if 4 <= y && y <= 9 then [x] else []) =<< zip [1,2,3,4,5,6,7,8,9] [0..]