Re: [Ruby] recursive lambda

看板Ruby作者 (godfat 真常)時間17年前 (2007/04/24 01:43), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串5/8 (看更多)
開了一個 ludy project 來玩…(採 Apache License 2.0) http://ludy.rubyforge.org/ http://rubyforge.org/projects/ludy/ 結果不會用 svn 被搞死了 Orz 有人可以稍微教一下嗎? @_@ 想全部砍掉重練都試不出來 Orz 裡面整理了一些以前寫的小程式,包含 Variable, Lazy 等 ※ 引述《noctem (noctem)》之銘言: : http://en.wikipedia.org/wiki/Y_combinator : Wikipedia 上說這個叫做 Z combinator. : Y combinator 則是 Y = \f . (\x . f (x x)) (\x . f (x x)) : 但 strict 的語言沒法直接用 Y combinator. 我試了一下: Y = lambda{|f| lambda{|x| f[x[x]] }[lambda{|x| f[x[x]] }] } 這樣寫沒問題,但 Y[fact][10] 立刻就會 stack overflow 不過套上一層間接呼叫之後,就可以正常使用了: Y = lambda{|f| lambda{|x| lazy{f[x[x]]} }[lambda{|x| lazy{f[x[x]]} }] } lazy 是我之前寫的小東西,本來以為曾經貼在板上過,但翻了一下好像沒有… 大概是本板 #534 那篇寫完之後寫的(大概是覺得太簡單就沒 post 了) 簡單地說就是 Y combinator 還是能用,只是需要一點修正 lazy 實作在這: class Lazy instance_methods.each{|m| undef_method m unless m =~ /^__/} def initialize func = nil, &block if block_given? then @func = block else raise TypeError, "#{func} don't respond to :call" unless func.respond_to? :call @func = func end end def method_missing msg, *arg, &block (@obj ||= @func.call).__send__ msg, *arg, &block end end def lazy arg = nil, &block Lazy.new arg, &block end 就只是很單純地轉一圈,然後 value 會 cache 起來避免重複運算 : Y combinator 是 Curry 發現的. 後來還發現了一大堆 fixed-point : combinators. 只能說這些人腦筋真好... 那 Yk = (L L L L L L L L L L L L L L L L L L L L L L L L L L) 真讓人傻眼! 我真想懷疑這是用程式跑出來的結果 O_o -- 「行け!Loki!」(rocky ロッキー) -Gurumin ぐるみん 王子? XD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.132.58.12
文章代碼(AID): #16BF0l0P (Ruby)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文 (最舊先):
完整討論串 (本文為第 5 之 8 篇):
文章代碼(AID): #16BF0l0P (Ruby)