Upgrade to Pro — share decks privately, control downloads, hide ads and more …

代数的データ型について #w8lt

代数的データ型について #w8lt

Shohei Yasutake

May 28, 2015
Tweet

More Decks by Shohei Yasutake

Other Decks in Programming

Transcript

  1. ͸͡Ίʹ • આ໌͕ؒҧ͍ͬͯΔՄೳੑ͕͋Γ·͢ • ಛʹޙ൒ • ؒҧ͍ͬͯͨΒ @amutake_s ʹڭ͑ͯԼ͍͞ •

    ͜Ε͸W8LTͱ͍͏LTձͰൃද͞Εͨ΋ͷͰ͢ • (౦޻େੜͷΈͰ͕͢)Α͚Ε͹ࢀՃ͍ͯͩ͘͠͞ • http://w8lt.connpass.com/
  2. ू߹࿦Ͱͷ௚ੵͱ௚࿨ • ू߹Aͱू߹Bͷ௚ੵ (direct product): 
 • ΑΓҰൠʹ
 • ू߹Aͱू߹Bͷ௚࿨

    (direct sum): 
 • ͨͩ͠ 0, 1 ͸ 0 ≠ 1 Ͱ͋ΔΑ͏ͳλά • ΑΓҰൠʹ A ⇥ B = {(a, b) | a 2 A ^ b 2 B} A + B = {(0, a) | a 2 A} [ {(1, b) | b 2 B} Y i20..n Xi = {( x0, · · · , xn) | x0 2 X0 ^ · · · ^ xn 2 Xn } a i20..n Xi = [ i20..n {( i, xi) | xi 2 Xi }
  3. ܕཧ࿦Ͱͷ௚ੵͱ௚࿨ • ܕAͱܕBͷ௚ੵܕ (product type): Pair A B = Pair

    A B • ΑΓҰൠʹ Tuple A B C … • ܕAͱܕBͷ௚࿨ܕ (sum type): Either A B = T0 A | T1 B • ΑΓҰൠʹ T0 A | T1 B | T2 C | …
  4. ୅දతͳྫ • ࣗવ਺ (ϖΞϊ਺) • Nat = Zero | Succ

    Nat • Ϧετ • List A = Nil | Cons A (List A) • 2෼໦ • BinTree A = Empty | Node A (BinTree A) (BinTree A)
  5. Haskell data Nat = Zero | Succ Nat data List

    a = Nil | Cons a (List a) data BinTree a = Empty | Node a (BinTree a) (BinTree a)
  6. OCaml type nat = Zero | Succ of nat type

    'a list = Nil | Cons of 'a * 'a list type 'a bin_tree = | Empty | Node of 'a * 'a bin_tree * 'a bin_tree
  7. Scala sealed trait Nat case object Zero extends Nat case

    class Succ(n: Nat) extends Nat sealed trait List[+A] case object Nil extends List[Nothing] case class Cons[A](hd: A, tl: List[A]) extends List[A] sealed trait BinTree[+A] case object Nil extends BinTree[Nothing] case class Node( v: A, l: BinTree[A], r: BinTree[A]) extends BinTree[A]
  8. Coq Inductive nat := | Zero : nat | Succ

    : nat -> nat. Inductive list (A : Type) := | nil : list A | cons : A -> list A -> list A. Inductive bin_tree (A : Type) := | empty : bin_tree A | node : A -> bin_tree A -> bin_tree A -> bin_tree A.
  9. Rust enum Nat { Zero, Succ(Box<Nat>) } enum List<A> {

    Nil, Cons(A, Box<List<A>>) } enum BinTree<A> { Empty, Node(A, Box<BinTree<A>>, Box<BinTree<A>>) }
  10. Swift protocol NatLike {} enum Nat : NatLike { case

    Zero case Succ(NatLike) } // List, BinTree ͸ΊΜͲ͍ͬ͘͞Ά͍ // (Α͘Θ͔Βͳ͍)
  11. F-࢝୅਺ • F-࢝୅਺ (ࣗݾؔख F : C → C ͷ࢝୅਺)

    ͱ ͸ɺF-୅਺͕ͳ͢ݍͷ࢝ର৅Ͱ͋Δ • ʁʁʁ
  12. ୅਺తߏ଄ (algebraic structure) • Magma, Semigroup, Monoid, Group, Ring, …

    • ͋Δू߹ɺͦͷ্ͷԋࢉͷू߹ɺ౳ࣜެཧͷ ू߹ɺͷ3ͭ૊Ͱද͞ΕΔߏ଄
  13. ྫ: ϞϊΠυ • : ू߹Xɺೋ߲ԋࢉɾɺ୯Ґݩ eɺ ҎԼͷ౳ࣜެཧ E • associativity:

    • identity: • ྫ: ࣗવ਺ͱ଍͠ࢉɺจࣈྻͱ࿈݁ɺͳͲͳͲ 8 x, y, z 2 X, ( x · y ) · z = x · ( y · z ) 8 x 2 X, e · x = x ^ x · e = x (X, {·, e}, E)
  14. ݍ (category) • ର৅ • ࣹ • dom, cod •

    ࣹͷ߹੒ͷ݁߹ੑ • ߃౳ࣹ
  15. ࢝ର৅ͱऴର৅ (initial object, terminal object) • ݍCʹ͍ͭͯɺ • ࢝ର৅: C

    ͷ೚ҙͷର৅ʹରͯ͠ɺͪΐ͏Ͳ ͻͱͭͷࣹ͕ଘࡏ͢ΔΑ͏ͳର৅ • ऴର৅: C ͷ೚ҙͷର৅͔Βɺͪΐ͏Ͳͻͱ ͭͷࣹ͕ଘࡏ͢ΔΑ͏ͳର৅
  16. ؔख (functor) • F : C → D • ҎԼͷߏ଄Λอͪͳ͕ΒݍΛࣸ͢

    • F : C → C ͷΑ͏ʹಉ͡ݍ΁ͷؔखΛಛʹࣗݾؔख (endofunctor) ͱݺͿ F(idA) = idF (A) F(g f) = F(g) F(f)
  17. ଟ߲ࣜؔख (polynomial functor) • ੵͱ༨ੵ (Sets ͩͱ௚ੵͱ௚࿨) Ͱද͞ΕΔؔख • ͨͩ͠ɺ1

    ͸ऴର৅ɺC_n ͸ఆ਺ • Sets ͷݍͩͱɺऴର৅͸ཁૉ͕1ͭͷू߹Ͱɺ1 → X ͷࣹ(ؔ਺)͸ X ͷཁૉ਺௨Γ͋Δ • (ͳΜͱͳ͘୅਺తσʔλܕͬΆ͍Ͱ͢Ͷʂ) F(X) = C0 ⇥ 1 + C1 ⇥ X + C2 ⇥ X2 + · · · + Cn ⇥ Xn
  18. F-୅਺ (F-algebra) • ࣗݾؔख F : C → C ʹର͢ΔɺC

    ͷର৅ X ͱ α : F(X) → X ͷࣹ ͷ૊ (X, α) Λ F-୅਺ ͱ͍͏ • ୅਺తߏ଄ͱͷؔ܎: F Λݍ Sets ͷଟ߲ࣜࣗݾؔखͱ͢ΔͱɺF- ୅਺ (X, α) ͸ू߹ X ͱͦͷ্ͷԋࢉͷू߹ α ʹͳΔ (౳ࣜެཧ ͸ͳ͍) • ͜Ε͕୅਺ͱݺ͹ΕΔॴҎʁ • ྫ: F(X) = 1 + X × X ʹର͢Δ (N, [0, +])
  19. ୅਺తσʔλܕͱF-୅਺ • ର৅ΛܕɺࣹΛؔ਺ͱ͢Δݍʹ͍ͭͯɺଟ߲ࣜࣗݾؔख F Λߟ͑Δͱɺ୅਺తσʔλܕ T ʹ͍ͭͯɺF-୅਺͸ (T, α) ʹͳΔ

    • α ͸஋ίϯετϥΫλ (λά) Λ͢΂ͯҰॹʹͨ͠Α͏ͳؔ਺ • ྫ: F(X) = 1 + X ͱ͢Δͱɺ୅਺తσʔλܕ T = T0 | T1 T ʹ͍ͭͯɺF-୅਺͸ (T, [T0, T1]) ʹͳΔ • ͜ͷݍͰ͸ऴର৅͸ϢχοτܕʹͳΔ • T0 Λ () → T ͷؔ਺ɺT1 Λ T → T ͷؔ਺ͱݟΔ • [T0, T1] ͸ɺ() + T → T ͷؔ਺ͰɺҾ਺ʹ () ͕དྷͨΒ T0 ΛɺT ͕དྷͨΒ T1 Λ࢖͏ͱ ͍͏ҙຯ
  20. ୅਺తσʔλܕͱF-࢝୅਺ • ୅਺తσʔλܕ T ͷF-୅਺ (T, α) ͕ F-୅਺ͷݍͷ࢝ର৅ʹͳΔ •

    ࢝ର৅ʹͳΔͱ͍͏͜ͱ͸ɺ೚ҙͷ F-୅਺ (X, x) ʹରͯͪ͠ΐ͏ͲҰͭͷ४ಉܕ ͕ଘࡏ͢Δͱ͍͏͜ͱ • ஋ίϯετϥΫλ α Λɺα ͷܕʹݱΕΔ T Λ X ʹม͑ͨؔ਺ x ʹஔ͖׵͑ͯɺࣗ ෼ࣗ਎ͷܕ͕ݱΕ͍ͯΔͱ͜Ζ͸࠶ؼ͢ΔΑ͏ʹ͢Δͱɺ೚ҙͷF-୅਺ (X, x) ʹ ରͯͪ͠ΐ͏ͲҰͭͷ४ಉܕΛ࡞Δ͜ͱ͕Ͱ͖Δ • ྫ: Either a b ܕ͸ԼͷΑ͏ͳఆٛͰ४ಉܕΛ࡞ΕΔ data Either a b = Left a | Right b either_cata : (a -> x) -> (b -> x) -> Either a b -> x either_cata lf rf (Left a) = lf a either_cata lf rf (Right b) = rf b
  21. ྫ: Nat ܕ data Nat = Zero | Succ Nat

    -- F(X) = 1 + X ͱͯ͠ɺ -- Լͷ nat_cata ʹ e : X, f : X -> X Λ౉͢ͱɺ -- F-୅਺ (Nat, [Zero, Succ]) ͔Β F-୅਺ (X, [e, f]) ΁ͷ४ಉܕͱͳΔ nat_cata :: x -> (x -> x) -> Nat -> x nat_cata e _ Zero = e nat_cata e f (Succ n) = f (nat_cata e f n)
  22. ྫ: Stream ܕ data Stream i o r = Done

    r | Yield o (Stream i o r) | Await (i -> Stream i o r) stream_cata :: (r -> x) -> (o -> x -> x) -> ((i -> x) -> x) -> Stream i o r -> x stream_cata df _ _ (Done r) = df r stream_cata df yf af (Yield o s) = yf o (stream_cata df yf af s) stream_cata df yf af (Await f) = af (stream_cata df yf af . f) • ͢͜͠ෳࡶͳྫ
  23. ྫ: Swap ܕ • ࣗ෼ࣗ਎ͷܕίϯετϥΫλ͕ݱΕΔ͚ΕͲ΋ܕύϥϝʔλ͕ҧ͍ͬͯΔྫ • ࣗ৴͕ͳ͍ data Swap l

    r = Pair l r | Swap (Swap r l) -- ୈೋҾ਺ͷܕ͕͜ΕͰ͍͍ͷ͔Θ͔Βͳ͍ swap_cata :: (l -> r -> x) -> (x -> x) -> Swap l r -> x swap_cata pf _ (Pair l r) = pf l r swap_cata pf sf (Swap sw) = sf (swap_cata (swap pf) sf sw)
  24. ओͳࢀߟจݙ • Wikipedia ͷ͍Ζ͍Ζͳ߲໨ • 2013೥ ݍ࿦ษڧձ ࢿྉ • http://nineties.github.io/category-seminar/

    • nLab (਺ֶʹಛԽͨ͠ Wikipedia Έ͍ͨͳ΋ͷ) ͷ͍Ζ͍Ζͳ߲໨ • http://ncatlab.org/nlab/show/HomePage • Benjamin C. Pierce, Basic Category Theory for Computer Scientists, 1991 • Steve Awodey, Category Theory, 2010