【发布时间】:2012-04-27 08:07:12
【问题描述】:
我正在尝试实现一种用于自动程序合成的简单函数式语言。
数据结构是函数和值的图,可编译为 javascript。
下图应该是一个折叠函数。 funcApp 节点连接到一个函数节点和多个值节点,并将函数应用于值。 arg0 是列表,arg1 是初始值 (z) arg2 是要应用的函数。
相当于下面的scheme定义(虽然我的'语言'不是Scheme,是图)
(define (foldr f z xs)
(if (null? xs)
z
(f (car xs) (foldr f z (cdr xs)))))
问题是因为没有特殊的操作符,所以一切,特别是if 只是一个普通的函数。在这种形式下,程序永远不会终止,而是会达到最大堆栈深度,因为 else 子句总是被计算。
我认为这个问题在某些语言中是通过惰性求值解决的。所以我的问题是:是否有没有这种无限递归的功能版本的 fold 2)如果有必要,从哪里开始考虑将惰性求值应用于这样的简单语言。
【问题讨论】:
-
if是 Scheme 中的一种特殊形式,因此 else 表达式总是 not 被计算。这里有什么问题? -
我知道Scheme就是这种情况,我想我在最后一段中非常明确地陈述了我的问题
-
第一个问题没看懂。 2) 的答案是“特别处理
if”。 -
@zenna:首先,非严格不等于懒惰。其次,Scheme 通过与其他函数调用不同的方式处理
if来解决这个问题(这称为特殊形式)。您不需要像 Haskell 那样进行全面的惰性评估(尽管您可以将if-then-else实现为 Haskell 中的一个简单函数)。 sepp 说如果你没有懒惰的if就不能写fold的声明并不完全正确(他已经删除了该评论):你可以通过向if提供lambdas 来模拟这种行为并调用结果。 -
顺便说一句,我的困惑主要来自于您提出的“方案”示例实际上不是方案 :)
标签: function haskell recursion lazy-evaluation fold