2011-12-16 34 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]