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

ラムダがあれば、なんでもできる

こと
September 15, 2024

 ラムダがあれば、なんでもできる

λ計算の超初歩的なチュートリアルを、JavaScriptを使ったハンズオンで行います。
PureScript, Haskell, OCamlなど、様々な関数型言語の背景世界を覗いてみましょう。

https://hackbar.connpass.com/event/328565/ での発表資料)

## 訂正
10ページ 11行目
```
(誤) const Pair = x => y => p(x)(y)
(正) const Pair = x => y => p => p(x)(y)
```

こと

September 15, 2024
Tweet

More Decks by こと

Other Decks in Programming

Transcript

  1. 自己紹介 なまえ:こと (@kotolabedev) 職業:Functional Programming Enthusiast (関数型プログラミング愛好家) 好きな言語: PureScript, OCaml,

    F* 趣味:コンカフェいく(はいにゃん帝国) →推しが卒業しました 😭😭😭😭 経歴: ~ 2018.3 物理が好きな電気系学生 2018.4 ~ 2024.3 某タツヤがCMしてる会社 社内SE 2024.1 ~ 現在 HACK.BAR 静的型付・純粋関数型メイド 2024.9 ~ 現在 某大学で研究者とエンジニアの間の子みたいな仕事 •◦◦◦◦◦◦◦◦ こと@HACK.BAR ラムダがあれば、なんでもできる 2 / 10 Hackers' MeetUp #3 - 2024/09/15
  2. ラムダ計算 (lambda calculus)とは!? コンピュータ(計算機)上でどんなことができるのか? = 計算とはなにか? という計算機科学の根源的な問いに答えるため Alonzo Churchが1930年代ごろに提唱したモデル ソフトウェア的観点からは、ラムダ計算は非常に単純な

    純粋関数型言語とみなすことができる Alonzo Church (1903.6.14 ~ 1995.8.11) 💡コンピュータプログラムを研究する人たちの共通言語 ◦•◦◦◦◦◦◦◦ こと@HACK.BAR ラムダがあれば、なんでもできる 3 / 10 Hackers' MeetUp #3 - 2024/09/15
  3. 本セッションの流れ 標準的なラムダ計算の導入 型無ラムダ計算におけるラムダ項 ( λ-term)の定義(syntax)を述べ、ラムダ項を別のラムダ項に置換(簡約)するための3つの規則 α-置換 β-簡約 η-変換 を記述する 型システムの導入(単純型付ラムダ計算

    STLC) 型システムを拡張していく(recursive & polymorphic type, type operation, …) このセッションではあえてそうしません! 実際にプログラムを書くことで、ラムダ計算の威力を実感するがゴール ラムダ計算のプログラムを記述し評価する環境として、Node.jsを使います ◦◦•◦◦◦◦◦◦ こと@HACK.BAR ラムダがあれば、なんでもできる 4 / 10 Hackers' MeetUp #3 - 2024/09/15
  4. 速習JavaScript (1) // 関数 function foo(name) { return "Hello, "

    + name + "!" } // 無名関数を変数に代入(束縛)することも可能 const foo = function (name) { return "Hello, " + name + "!" } // Arrow functions ... 無名関数を、functionキーワードを使わず定義する書き方 const foo = (name) => { return "Hello, " + name + "!" } // 更に、関数本体の中身が単なるreturn なら、それも省略できる const foo = (name) => "Hello, " + name + "!" // 引数が1つの場合は、引数の周りのカッコも省略できる const foo = name => "Hello, " + name + "!" ◦◦◦•◦◦◦◦◦ こと@HACK.BAR ラムダがあれば、なんでもできる 5 / 10 Hackers' MeetUp #3 - 2024/09/15
  5. 速習JavaScript (2) // 関数呼び出しのシンタックス const msg = foo("World") // msg

    == "Hello, World!" // 関数から関数をreturnすることもできる const add = function (x) { return function (y) { // この中では、外側の変数 x にアクセスできる return x + y } } // Arrow functionsを使うとスッキリ const add = (x) => { return (y) => { x + y } } const add = x => y => x + y // (x) => ((y) => x + y) とよむべし ◦◦◦◦•◦◦◦◦ こと@HACK.BAR ラムダがあれば、なんでもできる 6 / 10 Hackers' MeetUp #3 - 2024/09/15
  6. 速習JavaScript(3) 引数を2つとる関数に対して、二通りの表示ができる カリー化のおかげで、多引数関数はなくても問題ない。 // 2引数関数 function add (x, y) {

    return x + y } ↓ currying ↑ uncurrying // 1引数関数を返す1引数関数 const add = x => y => x + y // カリー化された関数を呼び出す const inc = add(1) // ≡ y => 1 + y ... 部分適用 const res = add(1)(2) // == inc(2) == 1 + 2 == 3 ◦◦◦◦◦•◦◦◦ こと@HACK.BAR ラムダがあれば、なんでもできる 7 / 10 Hackers' MeetUp #3 - 2024/09/15
  7. 自然数 以下の生成規則で作られる数 特別な数 Zero が存在する 任意の自然数 n について、その 次の自然数(successor) を与える演算

    Succ が存在する 自然数の例:               Zero ... 0            Succ(Zero) ... 1         Succ(Succ(Zero)) ... 2      Succ(Succ(Succ(Zero))) ... 3   Succ(Succ(Succ(Succ(Zero)))) ... 4 ◦◦◦◦◦◦•◦◦ こと@HACK.BAR ラムダがあれば、なんでもできる 8 / 10 Hackers' MeetUp #3 - 2024/09/15
  8. ライブコーディングで書いたものまとめ const True = t => f => t const

    False = t => f => f const jsbool = b => b(true)(false) const And = b1 => b2 => If(b1)(b2)(false) const Not = b => t => f => b(f)(t) const Z = f => x => x const S = n => f => x => f(n(f)(x)) const jsint = n => n(x => x + 1)(0) const Add = n => m => f => x => n(f)(m(f)(x)) const Mul = n => m => f => x => n(f(m))(x) const Pair = x => y => p(x)(y) const Fst = p => p(True) const Snd = p => p(False) // 以下はおまけ... predpair = n => n(nm => pair(S(fst(nm)))(fst(nm)))(pair(Z)(Z)) pred = n => snd(predpair(n)) const Sub = n => m => m(pred)(n) ◦◦◦◦◦◦◦◦• こと@HACK.BAR ラムダがあれば、なんでもできる 10 / 10 Hackers' MeetUp #3 - 2024/09/15