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

About purely functional language

Avatar for Ryosuke TAKASHIMA Ryosuke TAKASHIMA
August 28, 2020
120

About purely functional language

Avatar for Ryosuke TAKASHIMA

Ryosuke TAKASHIMA

August 28, 2020
Tweet

Transcript

  1. Simple か Easy か
 • Simple ⇔ Complex
 • Easy

    ⇔ Difficult
 • Simple で Easy なら理想的だが・・・
 • Easy を指向しているもの:
 Java の Annotation、Python のライブラリ群
 • 個人的には Simple を優先したい
 → Haskell、Lazy K、F#

  2. ラムダ計算
 • プログラム = データ + プロセス(メソッド/関数)
 • データだけでプログラムを実現することはできないが、
 プロセスだけで実現することはできる


    • データをプロセス(関数)で表現 = ラムダ計算
 • プログラムが扱う対象が1つだけになる(Simple!)
 データ
 プロセス
 データ

  3. ラムダ計算でのデータ型(1)
 • Numeric
 ◦ 0 = \f x -> x


    ◦ 1 = \f x -> f x
 ◦ 2 = \f x -> f (f x)
 ◦ f = (+ 1), x = 0 と考えると分かりやすい
 • Boolean
 ◦ true = \x y -> x
 ◦ false = \x y -> y

  4. ラムダ計算でのデータ型(2)
 • List
 ◦ cons = \x y f ->

    f x y
 ◦ car = \z -> z true
 car (cons x y) = cons x y true = true x y = x
 ◦ cdr = \z -> z false
 cdr (cons x y) = cons x y false = false x y = y
 
 • 文字列を数字のリストと捉えれば、文字列も扱える

  5. コンビネータ
 • よく使う関数に名前をつける
 • 恒等関数 I = \x -> x
 •

    関数合成 B = \f g x -> f (g x)
 • 引数交換 C = \f x y -> f y x
 • 破棄 K = \x y -> x
 • 複製 W = \f x -> f x x

  6. コンビネータを組み合わせる
 • true = \x y -> x = K


    • false = \x y -> y = CK
 • 0 = \f x -> x = CK
 • 1 = \f x -> f x = I
 • 2 = \f x -> f (f x) = WB
 その他の関数もコンビネータを組み合わせて実現できる

  7. コンビネータを組み合わせる
 • C K x y
 = (\f a b

    -> f b a) K x y
 = K y x
 = (\a b -> a) y x
 = y
 • 0 x y
 = (\f a -> a) x y
 = y

  8. SK コンビネータ
 • S = \x y z -> x

    z (y z)
 • K = \x y -> x
 • S と K ですべてのコンビネータを表現できる(Simple!)
 
 (実はコンビネータは1つで十分 → Iota)

  9. I = S K K
 • S K K x


    = (K x) (K x)
 = K x (K x)
 = x
 = I x
 S = \x y z -> x z (y z)
 K = \x y -> x

  10. B = S (K S) K
 • S (K S)

    K f g x
 = (K S) f (K f) g x
 = K S f (K f) g x
 = S (K f) g x
 = (K f) x (g x)
 = K f x (g x)
 = f (g x)
 = B f g x
 S = \x y z -> x z (y z)
 K = \x y -> x

  11. SK で表す数(デモ)
 • 0 = SK
 • 1 = SKK


    • 2 = SS(SK)(S(KS)K)
 • 3 = SS(SS(SK))(S(KS)K)
 • 8 = 3 2 = SS(SS(SK))(S(KS)K)(SS(SK)(S(KS)K))
 
 https://codepen.io/rst76/pen/BaKLjVN