Y Combnator

先日JARDで、第三級短縮コースを受けてきた。 公共財である電波を使うには、資格が必要になる。国家試験を受けるのがが正統な取得 方法であるが、お手軽に講習を受ける方法も用意されているのだ。

朝から晩まで缶詰にされて講習と終了試験を受けてきた。定員は50名ぐらいだったと 思ったけど、満席だった。結構年齢のいった方が多かった。(おいらも、その一人だけど) 驚いたのは、6歳の女の子が、パパ・ママに連れられて受講してた事。聞けば、漢字が 大分読めるようになったから受講させたとの事。

周りの人と話をしてみると、三級資格で空中線電力が50Wまで扱えるようになるのが 目玉みたいで(四級は10Wまで)、それが目当てという人ばかりであった。 おいらみたいに、純粋に電信をやりたいので、という人はいなかった。

何たって、電信は世界最古のデジタル通信ですからね。ノスタルジィーを感じるんですよ。 まあ、言ってみれば、蒸気機関車みたいなものかな。昔は陸蒸気と言って結構嫌われた みたいだけど、今は大人気で、あの人もご満悦だったしね。

講師の人が面白い事を言ってたよ。電話じゃ喋らないといけないので、お菓子をぼりぼり しながら無線出来ないじゃないですかって。 電信なら、指先だけで出来るので(受信はヘッドフォンを使えば)、無音で楽しめる。 テレビ見ながらだって、一向にかまわない。(そこまで行くには、トンツーを、言葉の ように聞ける必要があるけど)

それに、電信は世界共通語。一つ覚えるだけで世界中の人と交信出来る。難しい英語の 発音に苦労する必要は無いのだ。和文電信も覚えると楽しいらしいけど、何だか符号の マッピングが非合理的だからなあ。それに、日本語なら喋った方が絶対に速い。

電信符号を発明したモールスさんは、符号を決める時印刷工場へ行って、活字の 減り具合を調べて、良く使われる字(eとかtとか)から短い符号を割り当てて行った そうな。合理的な方法だね。

Y Combinator

Scheme手習いを読んでいる、とある方から Y Combinatorについての質問を受けた。 とっかかりの説明として出てた

  (define fact-maker
    (lambda (procedure)
      (lambda (n)
         (if (zero? n)
             1
             (* n ((procedure procedure) (- n 1)))))))

の、(procedure procedure) で、何故2つprocedure が並んでいるか、分からないと いう。左側は、手続き名で右側は引数ですって、答えておきました。(なんと言う、不親切 な回答だろう)

ちなみに、おいらも手習い本を持っているので、どこに出てるか調べてみたら、9章に あった。Yコンビネータと言うんだよと言う話は無かったけど。

だれでも、こういう難しい話に一度は挑戦したくなるようで、 The Y Combinatorとか 青木さんもやっておられました。 (それにしても、Yコンビネータで検索したら、45万件も引っかかってきたって、みんな 好きねぇ)

;;; 名前を付けただけ
(define (Y F)
  ((lambda (proc)
     (F (lambda (arg) ((proc proc) arg))))
   (lambda (proc)
     (F (lambda (arg) ((proc proc) arg))))))

;;; 自分自身を受け取る fact
(define (fact0 f)
  (lambda (n)
    (if (zero? n)
        1
        (* n (f (- n 1))))))

((Y fact0) 5)          ; 答えは 120
((fact0 (Y fact0)) 5)  ; これも、答えは 120

この(Y F) は、MIT SchemeのHomePageで 紋章の一部に使われてますね。勿論、主役は、再帰するλですけど。

ああ、上記は、青木さんの所から取ってきたけど、ちと、MIT記法に置き換えて います。MIT記法だと、lambdaが一つ消えますから、アレルギーが治まるかも。

不動様

上記のYコンビネータは、任意の関数の不動点を求める関数だそうです。

こちらのページでは、やはりScheme手習いに触発されて Y Combinatorに染まり 紋章が成り立つか検証までも されています。

rubyでも Y Combinator

この所、とんとご無沙汰してる ruby だけれど、きっとruby屋さんもやっているに 違いがないと思って調べてみたよ。

そしたら、やっぱりあった。rubyのある風景 最近はrubyってRoRのプラットフォームばかりと思っていたけど、lambda健在なり。

haskellでも Y Combinator

やっぱり、Haskellにも登場願おう。

Prelude> let y f = f (y f)
Prelude> y (\ f x -> if x == 1 then 1 else x * f (x - 1)) 5
120
Prelude> :q

何か、パズルをやってるみたい。