Haskell Zippers

Haskell中的Zippers是一個指向數據結構(例如樹)的某些特定位置的指針。

假設具有5個元素[45,7,55,120,56]的樹,可以將其表示為完全二叉樹。如果要更新此列表的最後一個元素,則需要遍曆所有元素以到達最後一個元素,然後再進行更新。

但是,如果我們以具有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])

在這裏,將重點放在前進或後退時整個字串的元素上。


上一篇: Haskell Monads 下一篇:無