可能是一个简单的例子,但我查看了文档并以Google搜索为例,我仍然不确定答案。在Haskell中获得一个子列表
如果我有像这样的列表:
[1,2,3,4,5,6,7,8,9,0]
,我要解开一个片,说从索引4索引8即我想:
[5,6,7,8,9]
什么是习惯的方法在Haskell中做到这一点?
可能是一个简单的例子,但我查看了文档并以Google搜索为例,我仍然不确定答案。在Haskell中获得一个子列表
如果我有像这样的列表:
[1,2,3,4,5,6,7,8,9,0]
,我要解开一个片,说从索引4索引8即我想:
[5,6,7,8,9]
什么是习惯的方法在Haskell中做到这一点?
首先,这不是一个数组,它是一个列表。我不是(仅)迂腐,因为数组在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]
后者是一个比较有效的。
你可能感兴趣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
需要作为输入开始索引和长度切片的。
嗯,不是很实用,但也许可以改进?
(\(x,y) -> if 4 <= y && y <= 9 then [x] else []) =<< zip [1,2,3,4,5,6,7,8,9] [0..]
> drop 4 (take 9 [1,2,3,4,5,6,7,8,9,0])
[5,6,7,8,9]
的
可能重复[是否有哈斯克尔名单切片(即蟒蛇)?](http://stackoverflow.com/questions/4597820/does-haskell-have-list-slices-ie-python ) – 2015-02-19 02:32:25