2011-12-16 64 views
16

可能是一个简单的例子,但我查看了文档并以Google搜索为例,我仍然不确定答案。在Haskell中获得一个子列表

如果我有像这样的列表:

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

,我要解开一个片,说从索引4索引8即我想:

[5,6,7,8,9] 

什么是习惯的方法在Haskell中做到这一点?

+0

可能重复[是否有哈斯克尔名单切片(即蟒蛇)?](http://stackoverflow.com/questions/4597820/does-haskell-have-list-slices-ie-python ) – 2015-02-19 02:32:25

回答

30

首先,这不是一个数组,它是一个列表。我不是(仅)迂腐,因为数组在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] 

后者是一个比较有效的。

+0

真棒谢谢 - 我也纠正它说列表而不是数组:) :) – PeterM 2011-12-16 04:51:32

+0

有问题?它们不应该用于一切,标准数组模块并不是很令人愉快,但[vector](http://hackage.haskell.org/package/vector)在适用时非常有用。虽然我同意在尝试使用它们之前应该熟悉清单... – ehird 2011-12-16 04:54:48

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] 

注意sliceData.Vector需要作为输入开始索引长度切片的。

0

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

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

[5,6,7,8,9]