読者です 読者をやめる 読者になる 読者になる

Data.Sequenceメモ

高速なキューData.Sequence.

空のキュー

Prelude Data.Sequence> empty
fromList []

キューの先頭に要素を追加

Prelude Data.Sequence> 1 <| 2 <| 3 <| empty
fromList [1,2,3]

キューの末尾に要素を追加

Prelude Data.Sequence> empty |> 1 |> 2 |> 3
fromList [1,2,3]

先頭から要素を一つ取り出す

Prelude Data.Sequence> viewl $ 1 <| 2 <| 3 <| empty
1 :< fromList [2,3]

viewl は Seq a の a を返すのではなく, ViewL a を返す。

Prelude Data.Sequence> :t viewl
viewl :: Seq a -> ViewL a

ViewL のパターンマッチ

foo :: ViewL Int -> Int
foo EmptyL    = -1
foo (x :< xs) = x

末尾から要素を一つ取り出す

Prelude Data.Sequence> viewr $ 1 <| 2 <| 3 <| empty
fromList [1,2] :> 3

viewr の場合は ViewR a が返る。

bar :: ViewR Int -> Int
bar EmptyR = -1
bar (xs :> x) = x

畳み込み

Seq a は Foldable クラスのインスタンス

import Data.Sequence
import qualified Data.Foldable as F

foo :: Seq Int -> [String]
foo = F.foldr bar []
  where
    bar :: Int -> [String] -> [String]
    bar x ys = show x : ys
*Main> foo $ 1 <| 2 <| 3 <| empty
["1","2","3"]

今のところ、これらだけでなんとかなっている。