可能是一个简单的,但我查看了文档并用Google搜索了示例,我仍然不确定答案。
如果我有这样的清单:
[1,2,3,4,5,6,7,8,9,0]
我想提取一个切片,比如从索引4到索引8,即我想要:
[5,6,7,8,9]
在Haskell中执行此操作的惯用方法是什么?
答案 0 :(得分:33)
首先,这不是一个数组,它是一个列表。我不是(仅仅)迂腐,因为数组在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]
后者效率更高。
答案 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..]