Re: [Ruby] recursive lambda
開了一個 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
討論串 (同標題文章)
Ruby 近期熱門文章
PTT數位生活區 即時熱門文章