2011-12-16 25 views
16

Muhtemelen bir kolay, ama ben dokümanlar baktı ve örnekler için googled ettik ve hala cevap emin değilim. Böyle bir liste varsaHaskell bir alt liste alın

:

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

ve ben bir dilim ayıklamak istiyorum, bunu istiyorum endeksi 4'ten endeksi 8 yani söylemek:

deyimsel yolu nedir
[5,6,7,8,9] 

Bunu Haskell'de yapmak için?

+0

olası yinelenen [mu Haskell sahip Liste Dilimler (yani Python)?] (Http://stackoverflow.com/questions/4597820/does-haskell-have-list-slices-ie-python) –

cevap

30

Her şeyden önce, bu bir dizi değil, bir liste. Diziler, Haskell'de listelerden çok daha sorunlu olduğundan (sadece) pedantic olmayacağım. bahsedilen

, tek bir ortak yol birlikte take ve drop kullanmaktır:

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] 

ikinci biraz daha etkilidir.

+0

müthiş teşekkürler - diziden ziyade liste demek için de düzelttim :) – PeterM

+0

Sorun? Her şey için kullanılmamalı ve standart dizi modülleri çok hoş değil, ancak [vektör] (http://hackage.haskell.org/package/vector) uygulanabilir olduğunda çok kullanışlıdır. Onları kullanmaya çalışmadan önce listeleme yeterliliğine ulaşıldığına katılıyorum da ... – ehird

+1

@ehird: Onları sorunsal olarak adlandırmamın ana nedenlerini listelediniz. Onlara "ben yararlı değil" ve "zararlı" diyemedim. – ibid

3

Data.Vector (slice) ilginizi çekebilir. endeksini ve dilim ait uzunluğunu başlayan girdi olarak Data.Vector yılında slice sürdüğünü

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] 

Not.

0

Hmmm, çok pratik değil, ama belki de geliştirilebilir mi?

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

Harita snd. filtre (liftA2 (&&) (> = 4) (<9). fst). zip [0]] '('' (<9)' sorusunun davranışını eşleştirmek için not edin. – ehird

+0

Dekapaj-süreç-kurnaz olmayan yaklaşım bu sorun için çok fazla iş gibi görünüyor. –

+0

Belki de indexedFilter f = map snd gibi bir şey olmalı. filtre (f.fst). zip [0 ..] 'veya lib'lerde bir genelleme? – Landei

4
> drop 4 (take 9 [1,2,3,4,5,6,7,8,9,0]) 

[5,6,7,8,9] 
ait