在 SICP 的 stream 2 视频中, Abelson 给出了一个使用模拟计算机求解微分方程的示例。然后他在Scheme中对此进行编程,使用惰性求值来绕过循环定义依赖。
他说,这种技术的问题在于,当您设计更复杂的程序时,您最终会在各处出现延迟表达式,从而使其难以理解。他说,要优雅地解决这个问题,你必须以一些表现力为代价让整个语言变得懒惰,即拖尾问题。
这是Miranda和Haskell采用的方法。在 Haskell 中,我发现很难推理出大的 O复杂性,而且很容易编写消耗太多内存和时间的程序。
我曾经和罗伯特哈珀谈过这个问题,他不同意你必须让你的整个语言变得懒惰才能使它变得优雅,这是 Haskell 的一个设计缺陷。让一种语言部分懒惰来解决这个问题的具体做法是什么?有这种语言的例子吗?我想了解更多关于函数式语言的信息,但是禁止副作用和随处可见的求值,包括 I/O,让事情有点……违反直觉。