可能是一個簡單的例子,但我查看了文檔並以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