1

私は最近、いくつかの要素だけを覗き見するためにリストをまたぐ必要がありました。これは一種のフィルター関数ですが、それほど単純ではありません。しかし、最初に、ここでの歩みは何ですか。

リスト(またはトラバース可能なタイプ)をストライドすることは、リストを折りたたむことと同じですが、頻繁に出会う要素をいくつか破棄します(ストライド値に関して)。要素をピックオフすると、ピックオフする次の値が次のストライドになります。たとえば、ストライド値を0に設定してリストをストライドすると、実際にはリストは変更されません。リストを1つストライドすると、2つに1つの要素が得られます。

stride 0 [1..10] == [1..10]
stride 1 [1..10] == [1,3,5,7,9]
stride 2 [1..10] == [1,4,7,10]

見てみましたが、リストData.Listには何も見つかりませんでした。strideだから私は自分とあなたをまたぐ関数を書いたのです!- もの:

import Data.DList

-- for Data.List
stride :: (Num a, Eq a) => a -> [b] -> [b]
stride s = toList . snd . foldl (\(sa,xa) x -> if sa == s then (0,xa `snoc` x) else (sa+1,xa)) (s,fromList [])

上記のように使用できます。Data.Listモジュールの一部として提案することは可能ですか?私はそれが大いに役立つと思います。

4

3 に答える 3

8

無限のリストでも機能し、より効率的な、より単純な実装は次のようになります。

stride :: Int -> [a] -> [a]
stride s = go
  where
    go (x:xs) = x : go (drop s xs)
    go _      = []

だけでなく他のタイプにも使用したい場合はInt

import Data.List

stride :: Integral i => i -> [a] -> [a]
stride s = go
  where
    go (x:xs) = x : go (genericDrop s xs)
    go _      = []

非整数型に対してこれを行うことは、IMOには意味がありません。

Data.Listモジュールの一部として提案することは可能ですか?

はい、それは可能です。libraries@haskell.orgメーリングリストで提案してください。

しかし、それは受け入れられないと思います。有用性が小さすぎてbaseパッケージに追加できません。別のパッケージに追加したほうがよいでしょう。おそらくそれを含めるのsplitが最善でしょう。

于 2013-01-04T15:30:43.207 に答える
3

この関数はあなたが望んでいることを正確に行うわけではありませんが、stride関数をそれに基づいて作成することができます:

chunksOf :: Int -> [a] -> [[a]]
chunksOf n = takeWhile (not . null) . map (take n) . iterate (drop n)

これで、ストライド関数は次のようになります。

stride :: Int -> [a] -> [a]
stride n = map head . chunksOf (n + 1)

サブリストが空にならないことが保証されるheadため、ここでは使用しても問題ありません。takeWhile (not . null)

于 2013-01-04T15:29:33.597 に答える
1

または、 lensパッケージを使用すると、次のことができます。

>stridingOf l n = (elementsOf l ((==0) . (flip mod (n + 1))))
>striding = stridingOf traverse
>stride n = toListOf striding

>stride 1 [1..10]
[1,3,5,7,9]

stridingOf を単にストライドするのではなく、わずかに余分に記述することで、テキストと byteString を簡単に使用できるようになります。レンズパッケージを使用しないと、はるかに難しい書き換えが可能になります。

>import Data.Text
>import Data.Text.Lens

>testText = pack "This is a test"
>toListOf (stridingOf text 1) testText
"Ti sats"

#レンズ

于 2013-01-06T00:24:18.313 に答える