- 15:32 うはー。チャリンコで渋谷に来たら暴風でエラいめにあった。っていうか帰りどうしよう。。。
- 16:07 風の音がすげー。これって春一番?
- 21:54 Yコンビネータのパズルが解けた!
- 22:02 def Y[A, B]( f : ((A) => B) => (A) => B) : (A) => B = { (m : A) => f( (n : A) => Y(f)(n) )(m) }
- 22:02 val fib = Y[Int,Int]( { (f: (Int) => Int) => { (n: Int) => if(n<=2) n else { f(n-1) + f(n-2) } } } )
- 22:03 fib(6) → Int = 13
- 22:05 [Int,Int]は要らないのか。> val fib = Y( { (f: (Int) => Int) => { (n: Int) => if(n<=2) n else { f(n-1) + f(n-2) } } } )
- 22:30 @amachang さんのページを参考に元の再帰関数をごにょごにょしていって、再帰させる関数と処理本体に分離していく様子が面白い。 @yuroyoro さんのページの形式に飛躍させるのに苦労したけど。 高校くらいに数式をごにょごにょしていた頃を思い出して楽しかったな。
- 22:42 お。@yuroyoro さんのページを意識しすぎてたけど、もうちょっと簡略にかけるっぽい。カリー化の効果? > def Y[A, B]( f : ((A) => B) => (A) => B) : (A) => B = { (m : A) => f( Y(f) )(m) }
- 22:44 ここまでくると Y(f) = f(Y(f)) の定義そのままだ。
- 22:49 元がフィボナッチだったせいか、変数名が自然数っぽい。修正。 > def Y[A, B]( f : ((A) => B) => (A) => B) : (A) => B = { (x : A) => f( Y(f) )(x) }
- 22:52 あー、型変数もだ。 型変数のYと関数名のYって競合しないんですね。 > def Y[X, Y]( f : ((X) => Y) => (X) => Y) : (X) => Y = { (x : X) => f( Y(f) )(x) }
- 22:56 そういえば再帰させる者自身が再帰してていいんだろうか。
- 22:57 @yoshimiJAPAN 僕もまだ理解してない。 [in reply to yoshimiJAPAN]
- 22:59 機能的には問題ないけど、そもそもの目的ではない気がしてきた。ていうかそもそも何これ?
- 23:06 @yoshimiJAPAN あー、物理も楽しそうね。余裕ができてきたらまたやってみたい。 [in reply to yoshimiJAPAN]
- 23:27 そうだ。「無名関数で再帰ができる」ためであれば先程のでもいいんだけど、λの形式で書くためであれば再帰を直接使ってはいけないんだ。目的の違う複数のページをガッチャンコしてしまって混乱してる。
- 23:31 λに対する理解が全然足りない、というかほぼ無い。 現時点ではまだλに深入りするつもりはないので、この件はこの辺までにして、また別の機会に考察を深めることにしよう。 Scalaの勉強のためには、大きく貢献してもらいました。
- 23:41 ところで @kis さんのページにチャーチ数とか出てきたけど、あれがやってることって、「数学ガール3巻」でやってた「数学を数学する」ってのと似てる。数値とか条件分岐、ループとかを関数で形式的に表すことによって、「プログラムをプログラムする」。
- 23:44 「数学を数学する」も「プログラムをプログラムする」も同じ「関数」を使って形式的に表現しようとしているってことか。λの目的がそれであるとすれば、めちゃくちゃ興味あるな〜。
- 23:45 はらへなう。
- 23:58 集中力切れた。今日はここまで。
2010/02/06 のつぶやき
トラックバック(0)
トラックバックURL: http://happy-camper.st/mt/mt-tb.cgi/682





コメントする