Haskell-zippers

提供:Dev Guides
移動先:案内検索

Haskell-ジッパー

Haskellの Zippers は、基本的に tree などのデータ構造の特定の場所を指すポインターです。

完全な二分木として表現できる5つの要素 [45,7,55,120,56] を持つ tree を考えてみましょう。 このリストの最後の要素を更新する場合は、すべての要素を走査して、更新する前に最後の要素に到達する必要があります。 右?

しかし、 N 要素を持つツリーが [(N-1)、N] のコレクションであるような方法でツリーを構築できたらどうでしょう。 次に、不要な*(N-1)*要素をすべて走査する必要はありません。 N番目の要素を直接更新できます。 これがまさにZipperのコンセプトです。 ツリー全体を走査せずにその値を更新できるツリーの特定の場所にフォーカスまたはポイントします。

次の例では、リストにZipperの概念を実装しています。 同様に、*ツリー*または*ファイル*データ構造にZipperを実装できます。

data List a = Empty | Cons a (List a) deriving (Show, Read, Eq, Ord)
type Zipper_List a = ([a],[a])

go_Forward :: Zipper_List a -> Zipper_List a
go_Forward (x:xs, bs) = (xs, x:bs)

go_Back :: Zipper_List a -> Zipper_List a
go_Back (xs, b:bs) = (b:xs, bs)

main = do
   let list_Ex = [1,2,3,4]
   print(go_Forward (list_Ex,[]))
   print(go_Back([4],[3,2,1]))

上記のプログラムをコンパイルして実行すると、次の出力が生成されます-

([2,3,4],[1])
([3,4],[2,1])

ここでは、前方または後方に向かって、弦全体の要素に注目しています。