1

リスト内包表記を使用してリストを半分に分割するにはどうすればよいですか?

例:もし私が持っていて[1,1,2,2,3,3,4,4,5,5] 、私が欲しいだけなら[1,1,2,2,3]

これまでの私の試み:

half mylist = [r | mylist!r ; r <- [0..(#mylist div 2)] ]    ||does not work

何かご意見は?

[注: これは実際には Haskell ではありませんが、似ています。! はリストの索引付けに使用され、# は長さを示します)

編集::

さて、それは

half mylist = [r | r <- [mylist!0..mylist!(#mylist div 2)] ]

機能しますが、文字列ではなく数値のリストでのみ機能します。手がかりはありますか?

4

2 に答える 2

8

これは、リスト内包表記を扱うのに適切なことではありません。リスト内包表記は、マップとフィルター (および zip) の代替構文です。リストの分割は折りたたみです。

そのため、別のアプローチを検討する必要があります。例えば

halve :: [a] -> [a]
halve [] = []
halve xs = take (n `div` 2) xs
    where n = length xs

最初に長さを取得するため、分割は大きなリストでの優れた操作ではありません (したがって、リストでは常にn + n/2操作になります。O(1)の長さと分割を持つ配列のような型により適しています)。.

于 2012-05-05T17:52:43.647 に答える