ૠೖιʔτ - ࣮
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)
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)...)
͜Εόϒϧιʔτʂ
͜ΕιʔτࡁΈͷϦετ