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
何か、パズルをやってるみたい。