◆ S と K と I を JavaScript で書いてみるとなんとなくわかった
◆ ような気がする 

いつのもようにネットの海を漂ってると 「SKI コンビネータ」というのを見つけました

なにこれ?

なんか関数型の言語で使われる考え方?みたいです
関数型言語かぁ JavaScript でなんか役に立つのかな?
と とりあえずぐぐってみます

キャラクターが解説してくれる系のページがありました
高階ことりちゃんと学ぶSKIコンビネータ

あまり頭いい系のキャラに見えないし(←すごく失礼)きっと丁寧に解説あるのかなー

鳥「例えば、λ式で関数を定義する場合、こんな形になるよね。」
ことりちゃん「うん。」

え?

ここでもう諦めました
ことりちゃんできる子だったんだね……
バカにしてごめんなさい

以降を流し見しましたけど理解できる気がしません
とりあえずことりちゃんかわいいので画像だけダウンロードして他のページを探しに行きます


困ったときの うぃきぺでぃあー
SKIコンビネータ計算
I(Identity combinator) は引数を返す:
Ix = x
K(Constant (独Konstant) combinator) にxだけを適用した場合、
任意の引数に対してxを返す1引数の定数関数 Kxを得る:
Kxy = x
S(Substitution combinator) は3つの引数を取って、1つ目の引数に3つ目の引数を適用し、
その結果に2つ目の引数に3つ目の引数を適用した結果を適用する。簡単に:
Sxyz = xz(yz)

ふむ

なるほどよくわからん

まずこの式がどうなってるのかわからないんですけど……


よし 次!

コンビネータ論理
またも Wikipedia です
もっとも単純なコンビネータの例は、以下のように定義される恒等コンビネータIである。
(I x) = x
もうひとつの単純なコンビネータはKで、定数関数を作る。
(K x)はどんな引数に対してもxを返す関数である。そして、Kはこのように定義する:
((K x) y) = x
もしくは、伝統的な複数の適用の表記に従えば
(K x y) = x
三つ目のコンビネータは、適用を一般化したSである。
(S x y z) = (x z (y z))
Sは、それぞれにzを適用したあとxをyに適用する。
別の言い方をすれば、zという環境においてxをyに適用する。
S and Kがあれば、Iは不必要である。なぜなら、他の二つでこのようにして表現できるからである。
((S K K) x)
= (S K K x)
= (K x (K x))
= x

さっきより式が見やすい!
Lisp ですね

上で Ix と書いてたのが (I x) ということとわかれば読むことはできます
I を JavaScript にしてみるとこんな感じ
function I(x){
return x
}

とりあえず見やすくするために他のも Arrow Function で書いてみます
var I = (x => x)
var K = (x => (y => x))
var S = (x => (y => (z => x(z)(y(z)))))

S が複雑ですね
function で丁寧に書いたほうがわかりやすいかも
function S(x){
return function(y){
return function(z){
var xz = x(z)
var yz = y(z)
return xz(yz)
}
}
}

で  I は S K K とか書くのと一緒だから無くてもいいってことらしいです
var tmp = S(K)(K)
tmp(1)
// 1

tmp(100)
// 100

tmp("aiueo")
// "aiueo"
おぉ 本当にそのまま返って来ますね

K は実行すると関数が返って来て その関数を実行すると 最初に K を実行した時に渡した値が返ってくるものです
K(1)(2) でも K(1)(100) でも K(1)() でも 1 です

S の中では こんなことになってます
function s(val){
var xz = K(val)
var yz = K(val)
return xz(yz)
}

xz に関数の yz を入れてますが何を引数にしてもいいので yz なんて気にせず val が返って来ます


納得できました


でもこれ何に使うの?
Wiki の続きには難しそうな数式がいっぱいですが 理解して何に使えるかよくわからないのにあんな複雑そうなものを読もうと思えないです

なのでとりあえずここまで!




豆知識ですが Emacs ユーザが愛用してる? SKK という変態 IME の名前は SKI の SKK から来ているようです
Emacs といえば Lisp ですし Lisp をはじめとする関数型言語の考え方の SKI コンビネータと関係あるってなんか自然でそうなのかーって思えますね
SKK は I (入力がそのまま出力)なので思ったまま入力できるということらしいですね
私からすると あれで思ったまま入力なんて出来る気がしないですけどねー