作者godfat (godfat 真常)
看板Ruby
标题Re: [Ruby] recursive lambda
时间Tue Apr 24 01:43:08 2007
开了一个 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