John Hughes 在他的文章" 为什么功能编程很重要 "中辩称,"懒惰评估可能是函数式程序员模块中最强大的模块化工具." 为此,他提供了一个这样的例子:
假设您有两个函数,"infiniteLoop"和"terminationCondition".您可以执行以下操作:
terminationCondition(infiniteLoop input)
Run Code Online (Sandbox Code Playgroud)
懒惰的评价,在休斯的话中"允许终止条件与循环体分离".这绝对是正确的,因为这里使用延迟评估的"terminationCondition"意味着可以在循环外定义这个条件 - 当terminationCondition停止请求数据时,infiniteLoop将停止执行.
但高阶函数不能达到如下相同的效果吗?
infiniteLoop(input, terminationCondition)
Run Code Online (Sandbox Code Playgroud)
懒惰评估如何提供高阶函数不提供的模块化?
haskell functional-programming lazy-evaluation higher-order-functions miranda
我试图理解为什么Git有很多地方可以存储更改.想象一个更简单的Git模型,它只有一个本地存储库(而不是一个单独的临时区域或工作区).在这个模型中:
换句话说,我们可以完成Git现在所做的大部分工作,但没有工作空间,暂存区域和本地存储库的概念混乱.为什么这三个都有用?
下面的代码输出"我是事."
class Thing
class << self
def foo
puts "I am #{self}."
end
end
end
Thing.foo
Run Code Online (Sandbox Code Playgroud)
我认为"自我"指的是Thing类型的对象,但它指的是Thing类.我从上一个问题(在评论中链接)中收集到,这与Thing是Object的一个实例有关.从类<< self开始的块实际上是在"self"是指Thing作为实例的上下文中执行的吗?这里发生了什么?
我想捕获发送到Ruby进程的信号.
该进程是以下文件,名为wait.rb:
sleep 60
Signal.trap(15) {
puts "caught signal 15!"
}
Run Code Online (Sandbox Code Playgroud)
我运行wait.rb,并在另一个bash shell中找到wait.rb的PID并执行:
kill -15 pid
Run Code Online (Sandbox Code Playgroud)
我期待"抓住信号15!" 将打印在我执行wait.rb的第一个shell中,但事实并非如此.相反,我得到这个输出:
Terminated: 15
Run Code Online (Sandbox Code Playgroud)
为什么块中的puts语句Signal.trap没有执行?