Получить подсписок в 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..]