Haskell-ジッパー

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

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

しかし、もし私たちが持っている木が持つような方法で私たちの木を構築することができたらどうでしょうか N 要素はのコレクションです [(N-1),N]。次に、すべての不要なものをトラバースする必要はありません(N-1)要素。N番目の要素を直接更新できます。これはまさにジッパーのコンセプトです。ツリー全体をトラバースせずにその値を更新できるツリーの特定の場所に焦点を合わせたり、ポイントしたりします。

次の例では、リストにジッパーの概念を実装しました。同様に、ジッパーを実装することができますtree または file データ構造。

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])

ここでは、前進中または後退中の文字列全体の要素に焦点を当てています。