2011-12-16 5 views
16

おそらく簡単ですが、私はドキュメントを見て、例を検索しましたが、まだ答えがわかりません。Haskellのサブリストを取得します。

私はこのようなリストがある場合:慣用的な方法は何

[5,6,7,8,9] 

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

を、私はスライスを抽出する、インデックス4から私が欲しいのインデックス8すなわちに言いますハスケルでこれをするには?

+0

[Haskellはリストのスライス(すなわちパイソン)を持っていますか?](http://stackoverflow.com/questions/4597820/does-haskell-have-list-slices-ie-pythonの可能重複) –

答えて

30

まず、配列ではなく、リストです。私は配列がHaskellのリストよりもはるかに問題が多いので、(単純な)ペタンティックではありません。

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] 

後者は少しより効率的である:一つの共通の方法は、一緒にtakedropを使用することで、前記

+0

awesome thanks - 配列ではなくリストを書くように修正しました:) – PeterM

+0

問題がありますか?それらはすべてに使われるべきではなく、標準の配列モジュールはそれほど楽しいものではありませんが、[vector](http://hackage.haskell.org/package/vector)は適用可能な場合に非常に便利です。私がリストを使ってみる前に、リストとの熟達度を達成することに同意しますが... – ehird

+1

@ehird:あなたは私が彼らに問題があると主な理由を挙げました。私はそれらを "役に立たない"と "有害な"ものと呼んでいませんでした:-) – ibid

3

Data.Vector (slice)に興味があるかもしれません。 始まるインデックスとスライスの長さは、入力としてData.Vectorsliceがかかること

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] 

注意。

0

うん、それほど実用的ではないが、おそらく改善できるだろうか?

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

'map sndについてはどうですか?フィルタ(liftA2(&&)(> = 4)(<9).fst)。ジップ[0 ..] '(質問の動作に合わせて'(<9) 'に注意してください)? – ehird

+0

decorate-process-undecorateのアプローチは、この問題のための余分な作業のようです。 –

+0

'indexedFilter f = map sndのようなものがあるはずです。フィルタ(f.fst)。 zip [0 ..] 'またはlibsの一般化? – Landei

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

[5,6,7,8,9] 
関連する問題