Hello,Unlambda world!!
Hello,Unlambda world!!
`r`````````````````````.H.e.l.l.o.,.U.n.l.a.m.b.a. .w.o.r.l.d.!.!i Hello,Unlambda world!!
うっは。
2行表示してみよう。
``r`````````````````````.H.e.l.l.o.,.U.n.l.a.m.b.a. .w.o.r.l.d.!.!i `r`````````````````````.H.e.l.l.o.,.U.n.l.a.m.b.a. .w.o.r.l.d.!.?i Hello,Unlambda world!! Hello,Unlambda world!?
苦戦。
3行はこうなるね。
``r`````````````````````.H.e.l.l.o.,.U.n.l.a.m.b.a. .w.o.r.l.d.!.!i ``r`````````````````````.H.e.l.l.o.,.U.n.l.a.m.b.a. .w.o.r.l.d.!.?i `r`````````````````````.H.e.l.l.o.,.U.n.l.a.m.b.a. .w.o.r.l.d.?.?i Hello,Unlambda world!! Hello,Unlambda world!? Hello,Unlambda world??
ぜぇぜぇ。
.aだけ返す。
`r```k.a.bi a
こうなると。
`r`.ai a
ifっぺぇ。
どうやら、kは関数を作れるらしい。
``kABでAを返す。`kAで関数を返せるから。1行目だけ返そう。
```kk`r`````````````````````.H.e.l.l.o.,.U.n.l.a.m.b.a. .w.o.r.l.d.!.!i k`r`````````````````````.H.e.l.l.o.,.U.n.l.a.m.b.a. .w.o.r.l.d.!.?i Hello,Unlambda world!!
しまった。スペルミスが大量に・・・。
UnlambdaはHaskellっぽい感じがする。結構ハマる。
SKコンビネータ
カリー化されてるので、ちょっと違うけど、Schemeで書くと、
s
λfgx.fx(gx)
(define (s f g x) ((f x) (g x)))
k
λxy.x
(define (k x y) x)
らしい。
部分適用の仕組みがちょっとづつわかってきたぞ。
SKコンビネータを作ってみよう!!
カリー化部分も含め作ってみよう。
(define (k x) (lambda (y) x)) (define (s x) (lambda (y) (lambda (z) ((x z) (y z))))) (((s k) k) s) ; #<procedure:s>
わーい。```skksが出来ちゃった。
Schemeでカリー
どうやら、カリーな書き方も出来るらしい・・・。
(define ((k x) y) x) (define (((s x) y) z) ((x z) (y z)))
へぇぇぇ。知らなかった・・・。
Bコンビネータ
何に使うのかイマイチなんだけど、いろんな部品に使えるらしい。
ちとむじぃのでメモ。
定義。
(define b ((s (k s)) k))
サンプル。
(((b x) y) z)
とりあえず中のxを料理
(b x) (((s (k s)) k) x) ; bを展開 (((k s) x) (k x)) ; sを展開 (s (k x)) ; kを適用
で、y,zを料理
(((s (k x)) y) z) (((k x) z) (y z)) ; sを展開 (x (y z)) ; kを適用
となる。
Bは関数合成に使うらしい。
B = λx.λy.λz. x (y z)
sとkだけでも読めるもんだな・・・。
メモ
繰り返し
```si `k``s.H``s.e``s.l``s.l``s.o``sri ``si``si``si``si``si``si``si``si`ki Hello Hello Hello Hello Hello Hello Hello Hello
まだイマイチ読めてない。``siの使いかたがポイントらしい。
おっと。公式発見。
```si `kX F ↓ `FX
公式を元に変換すると、最初のs i 関数 ループは何もやってない。
```si``si``si``si``si``si``si``si`ki ``s.H``s.e``s.l``s.l``s.o``sri
次に、ループの一個をsiとして、s i ループ 関数賭すると、
(関数 (ループ 関数))となって、関数を一回実行。
ループ 関数となるので、siを一個取り出して・・・最後はkiになるので、iを取り出して終了だ。
(有限コンビネータ 関数)という形になる。有限Yコンビネータだ。
無限にしてみる。
```sii ``s.H``s.e``s.l``s.l``s.o``sri
おぉぉ。無限ループ完成!!