在Haskell中获取一个子列表

时间:2011-12-16 04:35:20

标签: haskell

可能是一个简单的,但我查看了文档并用Google搜索了示例,我仍然不确定答案。

如果我有这样的清单:

[1,2,3,4,5,6,7,8,9,0]

我想提取一个切片,比如从索引4到索引8,即我想要:

[5,6,7,8,9]

在Haskell中执行此操作的惯用方法是什么?

4 个答案:

答案 0 :(得分:33)

首先,这不是一个数组,它是一个列表。我不是(仅仅)迂腐,因为数组在Haskell中比列表更有问题。

尽管如此,一种常见的方法是同时使用takedrop

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]

后者效率更高。

答案 1 :(得分:5)

您可能对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起始索引切片长度作为输入。

答案 2 :(得分:5)

> drop 4 (take 9 [1,2,3,4,5,6,7,8,9,0])

[5,6,7,8,9]

答案 3 :(得分:0)

嗯,不太实用,但也许可以改进?

(\(x,y) -> if 4 <= y && y <= 9 then [x] else []) =<< zip [1,2,3,4,5,6,7,8,9] [0..]