ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π·Π°ΡΡΡΠΆΠΊΡ Π΄Π»Ρ ΡΠΏΠΈΡΠΊΠΎΠ². Π§ΡΠΎΠ±Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠΎΠΊΡΡ Π½Π° ΠΏΠΎΠ΄ΡΠΏΠΈΡΠΊΠ°Ρ ΡΠΏΠΈΡΠΊΠ°, ΠΌΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΠΌΡΡ ΠΈΠ»ΠΈ Π²ΠΏΠ΅ΡΡΠ΄, ΠΈΠ»ΠΈ Π½Π°Π·Π°Π΄ (ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π΄Π΅ΡΠ΅Π²ΡΠ΅Π² ΠΌΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π»ΠΈΡΡ Π²Π²Π΅ΡΡ , Π²Π»Π΅Π²ΠΎ ΠΈΠ»ΠΈ Π²ΠΏΡΠ°Π²ΠΎ). ΠΠΎΠΌΠ΅ΡΡΠ½Π½ΠΎΠΉ Π² ΡΠΎΠΊΡΡ ΡΠ°ΡΡΡΡ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ΄ΡΠΏΠΈΡΠΎΠΊ, Π° ΠΊΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΎΡΡΠ°Π²Π»ΡΡΡ Β«Ρ Π»Π΅Π±Π½ΡΠ΅ ΠΊΡΠΎΡΠΊΠΈΒ» ΠΏΠΎ ΠΌΠ΅ΡΠ΅ Π½Π°ΡΠ΅Π³ΠΎ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ Π²ΠΏΠ΅ΡΡΠ΄.
Π ΠΈΠ· ΡΠ΅Π³ΠΎ ΡΠΎΡΡΠΎΡΠ»Π° Π±Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½Π°Ρ Β«Ρ Π»Π΅Π±Π½Π°Ρ ΠΊΡΠΎΡΠΊΠ°Β» Π΄Π»Ρ ΡΠΏΠΈΡΠΊΠ°? ΠΠΎΠ³Π΄Π° ΠΌΡ ΠΈΠΌΠ΅Π»ΠΈ Π΄Π΅Π»ΠΎ Ρ Π±ΠΈΠ½Π°ΡΠ½ΡΠΌΠΈ Π΄Π΅ΡΠ΅Π²ΡΡΠΌΠΈ, Π½ΡΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ, ΡΡΠΎΠ±Ρ Β«Ρ Π»Π΅Π±Π½Π°Ρ ΠΊΡΠΎΡΠΊΠ°Β» Ρ ΡΠ°Π½ΠΈΠ»Π° ΡΠ»Π΅ΠΌΠ΅Π½Ρ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉΡΡ Π² ΠΊΠΎΡΠ½Π΅ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΡΠ·Π»Π°, Π²ΠΌΠ΅ΡΡΠ΅ ΡΠΎ Π²ΡΠ΅ΠΌΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠ΅Π²ΡΡΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ Π½Π΅ Π²ΡΠ±ΡΠ°Π»ΠΈ. ΠΠ½Π° ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΠ»Π° Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡΡ, ΠΊΡΠ΄Π° ΠΌΡ ΠΏΠΎΡΠ»ΠΈ, β Π²Π»Π΅Π²ΠΎ ΠΈΠ»ΠΈ Π²ΠΏΡΠ°Π²ΠΎ. ΠΠΎΡΡΠΎΠΌΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΎΡΡ, ΡΡΠΎΠ±Ρ Π² Π½Π΅ΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠ°Π»Π°ΡΡ Π²ΡΡ ΠΈΠΌΠ΅ΡΡΠ°ΡΡΡ Π² ΡΠ·Π»Π΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ΄Π΄Π΅ΡΠ΅Π²Π°, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΡ ΡΠ΅ΡΠΈΠ»ΠΈ Π½Π°Π²Π΅ΡΡΠΈ ΡΠΎΠΊΡΡ.
Π‘ΠΏΠΈΡΠΊΠΈ ΠΏΡΠΎΡΠ΅, ΡΠ΅ΠΌ Π΄Π΅ΡΠ΅Π²ΡΡ. ΠΠ°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡΡ, ΠΏΠΎ ΡΠ»ΠΈ Π»ΠΈ ΠΌΡ Π²Π»Π΅Π²ΠΎ ΠΈΠ»ΠΈ Π²ΠΏΡΠ°Π²ΠΎ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π²Π³Π»ΡΠ±Ρ ΡΠΏΠΈΡΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΉΡΠΈ Π»ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ·Π»Π° ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠ΅Π²ΠΎ, Π½Π°ΠΌ ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡΡ ΠΏΡΡΠΈ, ΠΏΠΎ ΠΊΠΎΡΠΎΡΡΠΌ ΠΌΡ Π½Π΅ ΠΏΠΎΡΠ»ΠΈ. ΠΠ°ΠΆΠ΅ΡΡΡ, Π²ΡΡ, ΡΡΠΎ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡΡ, β ΡΡΠΎ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ. ΠΡΠ»ΠΈ Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠΎΠ΄Π΅ [3,4,5] ΠΈ ΠΌΡ Π·Π½Π°Π΅ΠΌ, ΡΡΠΎ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠΌ Π±ΡΠ»ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 2, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΉΡΠΈ Π½Π°Π·Π°Π΄, ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠΌΠ΅ΡΡΠΈΠ² ΡΡΠΎΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² Β«Π³ΠΎΠ»ΠΎΠ²ΡΒ» Π½Π°ΡΠ΅Π³ΠΎ ΡΠΏΠΈΡΠΊΠ°, ΠΏΠΎΠ»ΡΡΠ°Ρ [2,3,4,5].
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΡΠ΄Π΅Π»ΡΠ½Π°Ρ Β«Ρ Π»Π΅Π±Π½Π°Ρ ΠΊΡΠΎΡΠΊΠ°Β» Π·Π΄Π΅ΡΡ β ΠΏΡΠΎΡΡΠΎ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, Π½Π°ΠΌ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡ Π΅Ρ Π² ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ , ΠΊΠ°ΠΊ ΠΌΡ Π΄Π΅Π»Π°Π»ΠΈ ΡΡΠΎ, ΠΊΠΎΠ³Π΄Π° ΡΠΎΠ·Π΄Π°Π²Π°Π»ΠΈ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ Crumb, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π²ΡΠΈΠΉΡΡ Π·Π°ΡΡΡΠΆΠΊΠ°ΠΌΠΈ Π΄Π»Ρ Π΄Π΅ΡΠ΅Π²ΡΠ΅Π².
type ListZipper a = ([a], [a])
ΠΠ΅ΡΠ²ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΏΠΈΡΠΎΠΊ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΌΡ ΡΠΎΠΊΡΡΠΈΡΡΠ΅ΠΌΡΡ, Π° Π²ΡΠΎΡΠΎΠΉ β ΡΡΠΎ ΡΠΏΠΈΡΠΎΠΊ Β«Ρ Π»Π΅Π±Π½ΡΡ ΠΊΡΠΎΡΠ΅ΠΊΒ». ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡΡΡ Π²ΠΏΠ΅ΡΡΠ΄ ΠΈ Π½Π°Π·Π°Π΄ ΠΏΠΎ ΡΠΏΠΈΡΠΊΠ°ΠΌ:
goForward :: ListZipper a β> ListZipper a
goForward (x:xs, bs) = (xs, x:bs)
goBack :: ListZipper a β> ListZipper a
goBack (xs, b:bs) = (b:xs, bs)
ΠΠΎΠ³Π΄Π° ΠΌΡ Π΄Π²ΠΈΠΆΠ΅ΠΌΡΡ Π²ΠΏΠ΅ΡΡΠ΄, ΠΌΡ ΡΠΎΠΊΡΡΠΈΡΡΠ΅ΠΌΡΡ Π½Π° Β«Ρ Π²ΠΎΡΡΠ΅Β» ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠΏΠΈΡΠΊΠ° ΠΈ ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌ Π³ΠΎΠ»ΠΎΠ²Π½ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Β«Ρ Π»Π΅Π±Π½ΠΎΠΉ ΠΊΡΠΎΡΠΊΠΈΒ». ΠΡΠΈ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠΈ Π½Π°Π·Π°Π΄ ΠΌΡ Π±Π΅ΡΡΠΌ ΡΠ°ΠΌΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ Β«Ρ Π»Π΅Π±Π½ΡΡ ΠΊΡΠΎΡΠΊΡΒ» ΠΈ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ Π΅Ρ Π² Π½Π°ΡΠ°Π»ΠΎ ΡΠΏΠΈΡΠΊΠ°. ΠΠΎΡ ΡΡΠΈ Π΄Π²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΠΈ:
ghci> let xs = [1,2,3,4]
ghci> goForward (xs, [])
([2,3,4], [1])
ghci> goForward ([2,3,4], [1])
([3,4], [2,1])
ghci> goForward ([3,4], [2,1])
([4], [3,2,1])
ghci> goBack ([4], [3,2,1])
([3,4], [2,1])
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΈΠ΄Π΅ΡΡ, ΡΡΠΎ Β«Ρ Π»Π΅Π±Π½ΡΠ΅ ΠΊΡΠΎΡΠΊΠΈΒ» Π² ΡΠ»ΡΡΠ°Π΅ ΡΠΎ ΡΠΏΠΈΡΠΊΠ°ΠΌΠΈ β ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅Π²ΡΡΠ½ΡΡΠ°Ρ ΡΠ°ΡΡΡ Π²Π°ΡΠ΅Π³ΠΎ ΡΠΏΠΈΡΠΊΠ°. ΠΠ»Π΅ΠΌΠ΅Π½Ρ, ΠΎΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΌΡ ΡΠ΄Π°Π»ΡΠ΅ΠΌΡΡ, Π²ΡΠ΅Π³Π΄Π° ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΡΡΡ Π² Β«Π³ΠΎΠ»ΠΎΠ²ΡΒ» Β«Ρ Π»Π΅Π±Π½ΡΡ ΠΊΡΠΎΡΠ΅ΠΊΒ». ΠΠΎΡΠΎΠΌ Π»Π΅Π³ΠΊΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΡΡΡΡ Π½Π°Π·Π°Π΄, ΠΏΡΠΎΡΡΠΎ Π²ΡΠ½ΠΈΠΌΠ°Ρ ΡΡΠΎΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΈΠ· ΠΈΡ Β«Π³ΠΎΠ»ΠΎΠ²ΡΒ» ΠΈ Π΄Π΅Π»Π°Ρ Π΅Π³ΠΎ Β«Π³ΠΎΠ»ΠΎΠ²ΠΎΠΉΒ» Π½Π°ΡΠ΅Π³ΠΎ ΡΠΎΠΊΡΡΠ°. ΠΠ° Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΎΠΏΡΡΡ-ΡΠ°ΠΊΠΈ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ½ΡΡΡ, ΠΏΠΎΡΠ΅ΠΌΡ ΠΌΡ Π½Π°Π·ΡΠ²Π°Π΅ΠΌ ΡΡΠΎ Π·Π°ΡΡΡΠΆΠΊΠΎΠΉ: Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΡΠ΅Π½Ρ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡΠΈΠΉΡΡ Π²Π²Π΅ΡΡ -Π²Π½ΠΈΠ· Π·Π°ΠΌΠΎΠΊ Π·Π°ΡΡΡΠΆΠΊΠΈ-ΠΌΠΎΠ»Π½ΠΈΠΈ!
ΠΡΠ»ΠΈ Π±Ρ Π²Ρ ΡΠΎΠ·Π΄Π°Π²Π°Π»ΠΈ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΉ ΡΠ΅Π΄Π°ΠΊΡΠΎΡ, ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΏΠΈΡΠΎΠΊ ΡΡΡΠΎΠΊ Π΄Π»Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΡΡΠΎΠΊ ΡΠ΅ΠΊΡΡΠ°, ΠΊΠΎΡΠΎΡΡΠ΅ Π² ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΎΡΠΊΡΡΡΡ, Π° Π·Π°ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π·Π°ΡΡΡΠΆΠΊΡ, ΡΡΠΎΠ±Ρ Π·Π½Π°ΡΡ, Π½Π° ΠΊΠ°ΠΊΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ ΠΊΡΡΡΠΎΡ. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°ΡΡΡΠΆΠΊΠΈ ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ±Π»Π΅Π³ΡΠΈΠ»ΠΎ Π±Ρ Π²ΡΡΠ°Π²ΠΊΡ Π½ΠΎΠ²ΡΡ ΡΡΡΠΎΠΊ Π² Π»ΡΠ±ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ ΡΠ΅ΠΊΡΡΠ° ΠΈΠ»ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅ΡΡΠΈΡ ΡΡ ΡΡΡΠΎΠΊ.
ΠΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠ°Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ°
ΠΠ»Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΈ ΡΠ°Π±ΠΎΡΡ Π·Π°ΡΡΡΠΆΠ΅ΠΊ Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΄Π΅ΡΠ΅Π²ΡΡ, ΡΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ. ΠΠ°ΡΠ΅ΠΌ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°ΡΡ Π·Π°ΡΡΡΠΆΠΊΡ Π΄Π»Ρ ΡΡΠΎΠΉ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π½Π°ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°ΠΌΠΈ, ΠΊΠ°ΠΊ ΠΌΡ ΡΡΠΎ Π΄Π΅Π»Π°Π΅ΠΌ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π°Ρ ΠΏΠΎ ΡΠ΅Π°Π»ΡΠ½ΠΎΠΉ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅.
ΠΠ±ΡΡΠ½Π°Ρ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠΎΡΡΠΎΠΈΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΠΈΠ· ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ². Π€Π°ΠΉΠ»Ρ β ΡΡΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π΄Π°Π½Π½ΡΡ , ΡΠ½Π°Π±ΠΆΡΠ½Π½ΡΠ΅ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ. ΠΠ°ΡΠ°Π»ΠΎΠ³ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ ΠΌΠΎΠ³ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΡΠ°ΠΉΠ»Ρ ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΈ. ΠΠ»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ ΡΠ²Π»ΡΡΡΡΡ:
β’ ΡΠ°ΠΉΠ» ΠΏΠΎΠ΄ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ Π½Π΅ΠΊΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅;
β’ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ ΠΏΠΎΠ΄ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°ΠΌΠΈ ΡΠ²Π»ΡΡΡΡΡ ΠΈΠ»ΠΈ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ, ΠΈΠ»ΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°ΠΌΠΈ.
ΠΠΎΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ ΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌΡ ΡΠΈΠΏΠΎΠ², ΡΡΠΎΠ±Ρ Π±ΡΠ»ΠΎ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ ΠΊ ΡΠ΅ΠΌΡ:
type Name = String
type Data = String
data FSItem = File Name Data | Folder Name [FSItem] deriving (Show)
Π ΡΠ°ΠΉΠ»Ρ ΠΏΡΠΈΠ»Π°Π³Π°ΡΡΡΡ Π΄Π²Π΅ ΡΡΡΠΎΠΊΠΈ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΠΈΠ΅ Π΅Π³ΠΎ ΠΈΠΌΡ ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅. Π ΠΊΠ°ΡΠ°Π»ΠΎΠ³Ρ ΠΏΡΠΈΠ»Π°Π³Π°ΡΡΡΡ ΡΡΡΠΎΠΊΠ°, ΡΠ²Π»ΡΡΡΠ°ΡΡΡ Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΈ ΡΠΏΠΈΡΠΎΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ². ΠΡΠ»ΠΈ ΡΡΠΎΡ ΡΠΏΠΈΡΠΎΠΊ ΠΏΡΡΡ, Π·Π½Π°ΡΠΈΡ, ΠΌΡ ΠΈΠΌΠ΅Π΅ΠΌ ΠΏΡΡΡΠΎΠΉ ΠΊΠ°ΡΠ°Π»ΠΎΠ³.
ΠΠΎΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ ΠΈ ΠΏΠΎΠ΄ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°ΠΌΠΈ (Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΡΠΎ ΡΠΎ, ΡΡΠΎ Π² Π½Π°ΡΡΠΎΡΡΡΡ ΠΌΠΈΠ½ΡΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ Π½Π° ΠΌΠΎΡΠΌ Π΄ΠΈΡΠΊΠ΅):
myDisk :: FSItem
myDisk =
Folder "root"
[ File "goat_yelling_like_man.wmv" "Π±Π°Π°Π°Π°Π°Π°Π°"
, File "pope_time.avi" "ΠΠΎΠΆΠ΅, Π±Π»Π°Π³ΠΎΡΠ»ΠΎΠ²ΠΈ"
, Folder "pics"
[ File "ape_throwing_up.jpg" "Π±Π»ΠΈΠ½..."
, File "watermelon_smash.gif" "ΡΠΌΡΠΊ!!"
, File "skull_man(scary).bmp" "ΠΠΉ!"
]
, File "dijon_poupon.doc" "Π»ΡΡΡΠ°Ρ Π³ΠΎΡΡΠΈΡΠ°"
, Folder "programs"
[ File "sleepwizard.exe" "10 ΠΏΠΎΠΉΡΠΈ ΠΏΠΎΡΠΏΠ°ΡΡ"
, File "owl_bandit.dmg" "move ax, 42h"
, File "not_a_virus.exe" "ΡΠΎΡΠ½ΠΎ Π½Π΅ Π²ΠΈΡΡΡ"
, Folder "source code"
[ File "best_hs_prog.hs" "main = print (fix error)"
, File "random.hs" "main = print 4"
]
]
]
Π‘ΠΎΠ·Π΄Π°ΡΠΌ Π·Π°ΡΡΡΠΆΠΊΡ Π΄Π»Ρ Π½Π°ΡΠ΅ΠΉ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ
Π’Π΅ΠΏΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ°, Π²ΡΡ, ΡΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ, β ΡΡΠΎ Π·Π°ΡΡΡΠΆΠΊΠ°, ΡΡΠΎΠ±Ρ ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΡΡΡΠ³ΠΈΠ²Π°ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΠΈ Π±ΡΠ°ΡΡ Π΅Ρ ΠΊΡΡΠΏΠ½ΡΠΌ ΠΏΠ»Π°Π½ΠΎΠΌ, Π° ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ, ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΈ ΡΠ΄Π°Π»ΡΡΡ ΡΠ°ΠΉΠ»Ρ ΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΈ. ΠΠ°ΠΊ ΠΈ Π² ΡΠ»ΡΡΠ°Π΅ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π±ΠΈΠ½Π°ΡΠ½ΡΡ Π΄Π΅ΡΠ΅Π²ΡΠ΅Π² ΠΈ ΡΠΏΠΈΡΠΊΠΎΠ², Π½Π°ΡΠΈ Β«Ρ Π»Π΅Π±Π½ΡΠ΅ ΠΊΡΠΎΡΠΊΠΈΒ» Π±ΡΠ΄ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ±ΠΎ Π²ΡΡΠΌ, ΡΡΠΎ ΠΌΡ ΡΠ΅ΡΠΈΠ»ΠΈ Π½Π΅ ΠΏΠΎΡΠ΅ΡΠ°ΡΡ. ΠΡΠ΄Π΅Π»ΡΠ½Π°Ρ Β«Ρ Π»Π΅Π±Π½Π°Ρ ΠΊΡΠΎΡΠΊΠ°Β» Π΄ΠΎΠ»ΠΆΠ½Π° Ρ ΡΠ°Π½ΠΈΡΡ Π²ΡΡ, ΠΊΡΠΎΠΌΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠ΅Π²Π°, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΌΡ ΡΠΎΠΊΡΡΠΈΡΡΠ΅ΠΌΡΡ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ. ΠΠ½Π° ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ, Π³Π΄Π΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΠΎΡΠ²Π΅ΡΡΡΠΈΠ΅, ΡΡΠΎΠ±Ρ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π²Π²Π΅ΡΡ ΠΌΡ ΡΠΌΠΎΠ³Π»ΠΈ Π²ΡΡΠ°Π²ΠΈΡΡ Π² ΠΎΡΠ²Π΅ΡΡΡΠΈΠ΅ Π½Π°Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΡΠΎΠΊΡΡ.
Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Β«Ρ Π»Π΅Π±Π½Π°Ρ ΠΊΡΠΎΡΠΊΠ°Β» Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΏΠΎΡ ΠΎΠΆΠ° Π½Π° ΠΊΠ°ΡΠ°Π»ΠΎΠ³ β ΡΠΎΠ»ΡΠΊΠΎ Π²ΡΠ±ΡΠ°Π½Π½ΡΠΉ Π½Π°ΠΌΠΈ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π² Π½ΡΠΌ ΠΎΡΡΡΡΡΡΠ²ΠΎΠ²Π°ΡΡ. ΠΡ ΡΠΏΡΠΎΡΠΈΡΠ΅: Β«Π ΠΏΠΎΡΠ΅ΠΌΡ Π½Π΅ Π½Π° ΡΠ°ΠΉΠ»?Β» ΠΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΡΠΎΠΊΡΡΠΈΡΡΠ΅ΠΌΡΡ Π½Π° ΡΠ°ΠΉΠ»Π΅, ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ³Π»ΡΠ±Π»ΡΡΡΡΡ Π² ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ, Π° Π·Π½Π°ΡΠΈΡ, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ»Π° ΠΎΡΡΠ°Π²Π»ΡΡΡ Β«Ρ Π»Π΅Π±Π½ΡΡ ΠΊΡΠΎΡΠΊΡΒ», ΠΊΠΎΡΠΎΡΠ°Ρ Π³ΠΎΠ²ΠΎΡΠΈΡ, ΡΡΠΎ ΠΌΡ ΠΏΡΠΈΡΠ»ΠΈ ΠΈΠ· ΡΠ°ΠΉΠ»Π°. Π€Π°ΠΉΠ» β ΡΡΠΎ ΡΡΠΎ-ΡΠΎ Π²ΡΠΎΠ΄Π΅ ΠΏΡΡΡΠΎΠ³ΠΎ Π΄Π΅ΡΠ΅Π²Π°.
ΠΡΠ»ΠΈ ΠΌΡ ΡΠΎΠΊΡΡΠΈΡΡΠ΅ΠΌΡΡ Π½Π° ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ "root", Π° Π·Π°ΡΠ΅ΠΌ Π½Π° ΡΠ°ΠΉΠ»Π΅ "dijon_poupon.doc", ΠΊΠ°ΠΊ Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ Β«Ρ Π»Π΅Π±Π½Π°Ρ ΠΊΡΠΎΡΠΊΠ°Β», ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌ? ΠΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΈΠΌΡ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ, ΠΈΠ΄ΡΡΠΈΠΌΠΈ ΠΏΠ΅ΡΠ΅Π΄ ΡΠ°ΠΉΠ»ΠΎΠΌ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΌΡ ΡΠΎΠΊΡΡΠΈΡΡΠ΅ΠΌΡΡ, ΠΈ ΡΠ»Π΅Π΄ΠΎΠΌ Π·Π° Π½ΠΈΠΌ. ΠΠΎΡΡΠΎΠΌΡ Π²ΡΡ, ΡΡΠΎ Π½Π°ΠΌ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ, β Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Name ΠΈ Π΄Π²Π° ΡΠΏΠΈΡΠΊΠ° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ². Π₯ΡΠ°Π½Ρ Π΄Π²Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΠΏΠΈΡΠΊΠ° Π΄Π»Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΈΠ΄ΡΡΠΈΡ ΠΏΠ΅ΡΠ΅Π΄ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠΌ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΌΡ ΡΠΎΠΊΡΡΠΈΡΡΠ΅ΠΌΡΡ, ΠΈ Π΄Π»Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΈΠ΄ΡΡΠΈΡ Π·Π° Π½ΠΈΠΌ, ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΡΠΎΡΠ½ΠΎ Π·Π½Π°ΡΡ, Π³Π΄Π΅ ΠΌΡ Π΅Π³ΠΎ ΠΏΠΎΠΌΠ΅ΡΡΠΈΠ»ΠΈ, ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π²Π²Π΅ΡΡ . Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π½Π°ΠΌ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ ΠΌΠ΅ΡΡΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡΠ²Π΅ΡΡΡΠΈΡ.
ΠΠΎΡ Π½Π°Ρ ΡΠΈΠΏ Β«Ρ Π»Π΅Π±Π½ΠΎΠΉ ΠΊΡΠΎΡΠΊΠΈΒ» Π΄Π»Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ:
data FSCrumb = FSCrumb Name [FSItem] [FSItem]
deriving (Show)
Π Π²ΠΎΡ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌ ΡΠΈΠΏΠ° Π΄Π»Ρ Π½Π°ΡΠ΅ΠΉ Π·Π°ΡΡΡΠΆΠΊΠΈ:
type FSZipper = (FSItem, [FSCrumb])
ΠΠ΄ΡΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π²Π²Π΅ΡΡ ΠΏΠΎ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΠΈ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ. ΠΡ Π±Π΅ΡΡΠΌ ΡΠ°ΠΌΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ Β«Ρ Π»Π΅Π±Π½ΡΡ ΠΊΡΠΎΡΠΊΡΒ» ΠΈ ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌ Π½ΠΎΠ²ΡΠΉ ΡΠΎΠΊΡΡ ΠΈΠ· ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠΎΠΊΡΡΠ° ΠΈ Β«Ρ Π»Π΅Π±Π½ΠΎΠΉ ΠΊΡΠΎΡΠΊΠΈΒ» ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
fsUp :: FSZipper β> FSZipper
fsUp (item, FSCrumb name ls rs:bs) = (Folder name (ls ++ [item] ++ rs), bs)
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π°ΡΠ΅ΠΉ Β«Ρ Π»Π΅Π±Π½ΠΎΠΉ ΠΊΡΠΎΡΠΊΠ΅Β» Π±ΡΠ»ΠΈ ΠΈΠ·Π²Π΅ΡΡΠ½Ρ ΠΈΠΌΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π΄ Π½Π°Ρ ΠΎΠ΄ΡΡΠΈΠΌΡΡ Π² ΡΠΎΠΊΡΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠΌ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° (ΡΠΎ Π΅ΡΡΡ ls), ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ»ΠΈ Π·Π° Π½ΠΈΠΌ (ΡΠΎ Π΅ΡΡΡ rs), ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡΡΡ Π²Π²Π΅ΡΡ Π±ΡΠ»ΠΎ Π»Π΅Π³ΠΊΠΎ.
ΠΠ°ΠΊ Π½Π°ΡΡΡΡ ΠΏΡΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ Π²Π³Π»ΡΠ±Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ? ΠΡΠ»ΠΈ ΠΌΡ Π½Π°Ρ ΠΎΠ΄ΠΈΠΌΡΡ Π² "root" ΠΈ Ρ ΠΎΡΠΈΠΌ ΡΡΠΎΠΊΡΡΠΈΡΠΎΠ²Π°ΡΡΡΡ Π½Π° ΡΠ°ΠΉΠ»Π΅ "dijon_poupon. doc", ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΠ°Ρ Π½Π°ΠΌΠΈ Β«Ρ Π»Π΅Π±Π½Π°Ρ ΠΊΡΠΎΡΠΊΠ°Β» Π±ΡΠ΄Π΅Ρ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΠΈΠΌΡ "root" Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ, ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΌΠΈ ΡΠ°ΠΉΠ»Ρ "dijon_poupon.doc", ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ, ΠΈΠ΄ΡΡΠΈΠΌΠΈ Π·Π° Π½ΠΈΠΌ. ΠΠΎΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ, ΠΏΠΎΠ»ΡΡΠΈΠ² ΠΈΠΌΡ, ΡΠΎΠΊΡΡΠΈΡΡΠ΅ΡΡΡ Π½Π° ΡΠ°ΠΉΠ»Π΅ ΠΈΠ»ΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅, ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠΌ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅, ΠΊΡΠ΄Π° Π² ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π°Π²Π΅Π΄ΡΠ½ ΡΠΎΠΊΡΡ:
import Data.List (break)
fsTo :: Name β> FSZipper β> FSZipper
fsTo name (Folder folderName items, bs) =
let (ls, item:rs) = break (nameIs name) items
in (item, FSCrumb folderName ls rs:bs)
nameIs :: Name β> FSItem β> Bool
nameIs name (Folder folderName _) = name == folderName
nameIs name (File fileName _) = name == fileName
Π€ΡΠ½ΠΊΡΠΈΡ fsTo ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Name ΠΈ FSZipper ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ FSZipper, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠΎΠΊΡΡΠΈΡΡΠ΅ΡΡΡ Π½Π° ΡΠ°ΠΉΠ»Π΅ Ρ Π·Π°Π΄Π°Π½Π½ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ. ΠΡΠΎΡ ΡΠ°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠΈΡΡΡΡΡΠ²ΠΎΠ²Π°ΡΡ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅, Π½Π°Ρ ΠΎΠ΄ΡΡΠ΅ΠΌΡΡ Π² ΡΠΎΠΊΡΡΠ΅. ΠΠ°Π½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ ΠΏΠΎΠΈΡΠΊ Π²Π΅Π·Π΄Π΅ β ΠΎΠ½Π° ΠΏΡΠΎΡΡΠΎ ΡΠΌΠΎΡΡΠΈΡ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅.