Slide 1

Slide 1 text

Recursion SchemesͰߟ͑Δ ฒ΂ସ͑ΞϧΰϦζϜ 2019/11/29 by lotz at Gotanda.hs

Slide 2

Slide 2 text

ࣗݾ঺հ • HaskellͱػցֶशΛ
 झຯͰ΍͍ͬͯΔऀͰ͢ • ීஈ͸൒ଂ໳Ͱಇ͘ΤϯδχΞ • Twitter: @lotz84_
 ࣭໰͕͋Ε͹ͪ͜Β·Ͱ • GitHub: @lotz84

Slide 3

Slide 3 text

ฒ΂ସ͑ΞϧΰϦζϜ

Slide 4

Slide 4 text

όϒϧιʔτ [1, 6, 5, 2] [1, 6, 5, 2] [1, 5, 6, 2] [1, 5, 2, 6] [1, 5, 2, 6] [1, 5, 2, 6] [1, 2, 5, 6] [1, 2, 5, 6] ೖΕସ͑ ೖΕସ͑ ೖΕସ͑

Slide 5

Slide 5 text

ૠೖιʔτ [] [1, 6, 5, 2] [1] [6, 5, 2] [1, 6] [5, 2] [1, 5, 6] [2] [1, 2, 5, 6] []

Slide 6

Slide 6 text

ૠೖιʔτ - ࣮૷ insertSort :: [Int] -> [Int] insertSort xs = go [] xs where go ys [] = ys go ys (x:xs) = go (insert x ys) xs insert :: Int -> [Int] -> [Int] insert x ys = xs ++ [x] ++ zs where (xs, zs) = span (<= x) ys

Slide 7

Slide 7 text

ૠೖιʔτ - foldr foldr :: (a -> b -> b) -> b -> [a] -> b foldr _ z [] = z foldr k z (y:ys) = y `k` foldr k z ys insertSort :: [Int] -> [Int] insertSort = foldr insert [] ࣮૷ͷ࠶ؼతͳߏ଄ΛGPMESΛ࢖ͬͯ෼཭ 3FDVSTJPO4DIFNFT

Slide 8

Slide 8 text

Recursion Schemes ࠶ؼతͳߏ଄Λ෼཭͢Δ

Slide 9

Slide 9 text

࠶ؼతߏ଄͸Ͳ͔͜ΒདྷΔͷ͔ʁ data [] a = [] | a : [a] ͦ΋ͦ΋ܕͷఆ͕ٛ࠶ؼత

Slide 10

Slide 10 text

data [] a = [] | a : [a] ࠶ؼతͰ͸ͳ͍ܕ data List r = Nil | Cons Int r ࠶ؼతͳߏ଄Λ࣋ͭ൚༻తͳܕ newtype Fix f = In {out :: f (Fix f)} ͋ͱͰܕΫϥε੍໿Λॻ͘ྔΛݮΒͨ͢Ί *OUͷ৔߹ʹݶఆ͠·͢ ࠶ؼతͳܕΛ෼ղ͢Δ

Slide 11

Slide 11 text

Fix List ͸ [Int] ͱ ಉܕ toList :: Fix List -> [Int] toList (In Nil) = [] toList (In (Cons x xs)) = x : toList xs fromList :: [Int] -> Fix List fromList [] = In Nil fromList (x:xs) = In $ Cons x (fromList xs)

Slide 12

Slide 12 text

Fix f f (Fix f) In out

Slide 13

Slide 13 text

Catamorphism cata :: Functor f => (f a -> a) -> Fix f -> a cata g = g . fmap (cata g) . out cata g fmap (cata g) g

Slide 14

Slide 14 text

Anamorphism ana :: Functor f => (a -> f a) -> a -> Fix f ana g = In . fmap (ana g) . g g ana g fmap (ana g)

Slide 15

Slide 15 text

ฒ΂ସ͑ΞϧΰϦζϜͷܕ ιʔτࡁΈͷϦετΛද͢ܕ data SList r = Nil' | Cons' Int r sort :: Fix List -> Fix SList (List a -> a) -> Fix List -> a (a -> SList a) -> a -> Fix SList

Slide 16

Slide 16 text

Fix List ʹ஫໨ͨ͠৔߹ sort :: Fix List -> Fix SList sort = cata (? :: List (Fix SList) -> Fix SList) = cata $ ana (?? :: List (Fix SList) -> SList (List (Fix SList))) = cata $ ana (??? . fmap out) ??? :: List (SList (Fix SList)) -> SList (List (Fix SList))

Slide 17

Slide 17 text

Fix SList ʹ஫໨ͨ͠৔߹ sort :: Fix List -> Fix SList sort = ana (? :: Fix List -> SList (Fix List)) = ana $ cata (?? :: List (SList (Fix List)) -> SList (Fix List)) = ana $ cata (fmap In . ???) ??? :: List (SList (Fix List)) -> SList (List (Fix List))

Slide 18

Slide 18 text

෼഑๏ଇ swap :: List (SList x) -> SList (List x) swap Nil = Nil' swap (Cons a Nil') = Cons' a Nil swap (Cons a (Cons' b x)) | a <= b = Cons' a (Cons b x) | otherwise = Cons' b (Cons a x)

Slide 19

Slide 19 text

2ͭͷฒ΂ସ͑ΞϧΰϦζϜ > toList . cata (ana (swap . fmap out)) . fromList $ [1,6,5,2] [1,2,5,6] > toList . ana (cata (fmap In . swap)) . fromList $ [1,6,5,2] [1,2,5,6]

Slide 20

Slide 20 text

cata (ana (swap . fmap out)) (In (Cons 1 (In (Cons 6 (In (Cons 5 (In (Cons 2 (In Nil)…) ana f (Cons 1 (ana f (Cons 6 (ana f (Cons 5 (ana f (Cons 2 (ana f Nil)…) ana f (Cons 1 (ana f (Cons 6 (ana f (Cons 5 (In (Cons’ 2 (In Nil’))…) cata - ana - swap DBUB͸શͯͷ*OΛஔ͖׵͑Δ ͜͜·ͰධՁ͢Δ ͜Ε͸ιʔτࡁΈͷϦετ

Slide 21

Slide 21 text

ana f (Cons 1 (ana f (Cons 6 (ana (swap . fmap out) (Cons 5 (In (Cons’ 2 (In Nil’))…) ana f (Cons 1 (ana f (Cons 6 (In . fmap (ana f) $ swap (Cons 5 (Cons’ 2 (In Nil’))…) ana f (Cons 1 (ana f (Cons 6 (In (Cons’ 2 (ana f (Cons 5 (In Nil’))…) ͜Ε͸ૠೖιʔτʂ˞ ల։ͯ͠GNBQPVUΛద༻͢Δ Ұͭ಺ଆʹBOBGΛ࢓ࠐΜͰશମΛ*OͰแΉ

Slide 22

Slide 22 text

ana - cata - swap ana (cata (fmap In . swap)) (In (Cons 1 (In (Cons 6 (In (Cons 5 (In (Cons 2 (In Nil)…) In . fmap (ana f) . cata (fmap In . swap) $ (In (Cons 1 (In (Cons 6 (In (Cons 5 (In (Cons 2 (In Nil)…) In . fmap (ana f) $ g (Cons 1 (g (Cons 6 (g (Cons 5 (g (Cons 2 (g Nil)…) In . fmap (ana f) $ g (Cons 1 (g (Cons 6 (g (Cons 5 (Cons’ 2 (In Nil)…) BOBΛల։͢Δ DBUB͸શͯͷ*OΛஔ͖׵͑Δ ͜͜·ͰධՁ͢Δ

Slide 23

Slide 23 text

In . fmap (ana f) $ g (Cons 1 (g (Cons 6 ((fmap In . swap) (Cons 5 (Cons’ 2 (In Nil)…) In . fmap (ana f) $ g (Cons 1 (g (Cons 6 (In (Cons’ 2 (In (Cons 5 (In Nil)…) In . fmap (ana f) $ Cons’ 1 (In (Cons 2 (In (Cons 6 (In (Cons 5 (In Nil)…) In (Cons’ 1 (ana (cata (fmap In . swap)) (In (Cons 2 (In (Cons 6 (In (Cons 5 (In Nil)...) ͜Ε͸όϒϧιʔτʂ ͜Ε͸ιʔτࡁΈͷϦετ

Slide 24

Slide 24 text

ૠೖιʔτ※ ͱ όϒϧιʔτ͸ ૒ରʂʂ ˞ͨͩ͠φΠʔϒͳૠೖιʔτ

Slide 25

Slide 25 text

·ͱΊ • Recursion SchemesͰߟ͑Δͱ
 φΠʔϒͳૠೖιʔτͱόϒϧιʔτ͸૒ର • ࣮͸͞ΒʹPara / ApoΛ༻͍Δͱ
 ૠೖιʔτͱબ୒ιʔτͷ૒ରؔ܎΋෼͔Δ • ৄ͘͠͸
 Ralf Hinze, et al; “A Duality of Sorts”, 2013.

Slide 26

Slide 26 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠