ist ein Beispiel der Verwendung eines Reißverschlusses in Haskell:Was sind die Unterschiede zwischen Brillengläsern und Reißverschlüssen? Diese
data Tree a = Fork (Tree a) (Tree a) | Leaf a
data Cxt a = Top | L (Cxt a) (Tree a) | R (Tree a) (Cxt a)
type Loc a = (Tree a, Cxt a)
left :: Loc a -> Loc a
left (Fork l r, c) = (l, L c r)
right :: Loc a -> Loc a
right (Fork l r, c) = (r, R l c)
top :: Tree a -> Loc a
top t = (t, Top)
up :: Loc a -> Loc a
up (t, L c r) = (Fork t r, c)
up (t, R l c) = (Fork l t, c)
upmost :: Loc a -> Loc a
upmost [email protected](t, Top) = l
upmost l = upmost (up l)
modify :: Loc a -> (Tree a -> Tree a) -> Loc a
modify (t, c) f = (f t, c)
Dies ist ein Beispiel der Verwendung eines Reißverschlusses in Clojure:
(use 'clojure.zip)
(require '[clojure.zip :as z])
user> (def z [[1 2 3] [4 [5 6] 7] [8 9]])
#'user/z
user> (def zp (zipper vector? seq (fn [_ c] c) z))
#'user/zp
user> zp
[[[1 2 3] [4 [5 6] 7] [8 9]] nil]
user> (-> zp down)
[[1 2 3] {:l [], :pnodes [[[1 2 3] [4 [5 6] 7] [8 9]]], :ppath nil, :r ([4 [5 6] 7] [8 9])}]
user> (first (-> zp down))
[1 2 3]
Dies ist ein Beispiel für die Verwendung einer Linse in Haskell:
data Person = P { name :: String
, addr :: Address
}
data Address = A { street :: String
, city :: String
, postcode :: String
}
setPostcode :: String -> Person -> Person
setPostcode pc p = p { addr = addr p { postcode = pc }}
Dies ist ein Beispiel für die Verwendung eines Objektivs in Clojure.
Nun scheint es, dass sowohl Objektive als auch Zipper funktionale Wege sind, verschachtelte Datenstrukturen zu durchlaufen.
Meine Frage ist: Was sind die Unterschiede zwischen Linsen und Reißverschlüssen? Ist einer für einen bestimmten Anwendungsfall geeignet?
Sie können sich in Reißverschlüssen bewegen? Im Allgemeinen haben Reißverschlüsse "nach links gehen", "nach oben gehen", usw. Primitive; Normalerweise kann man ein Objektiv nicht ein wenig nach links bewegen. Sie sind jedoch eng miteinander verbunden. – drquicksilver
Ein Objektiv ist konzeptuell ein Getter/Setter-Paar, das beliebig tief in eine Datenstruktur eindringen kann (es ist sogar noch etwas allgemeiner). Ein Zipper ist eine bestimmte Art von Datenstruktur, in der Sie (mindestens) nach links und rechts/oben und unten gehen können. –