Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 在简单的纯函数式语言中实现fold而无需延迟计算_Function_Haskell_Recursion_Lazy Evaluation_Fold - Fatal编程技术网

Function 在简单的纯函数式语言中实现fold而无需延迟计算

Function 在简单的纯函数式语言中实现fold而无需延迟计算,function,haskell,recursion,lazy-evaluation,fold,Function,Haskell,Recursion,Lazy Evaluation,Fold,我正在尝试实现一种简单的函数式语言,用于自动程序合成。 数据结构是一个函数和值的图形,可以编译成javascript。 下图应为折叠函数funcApp节点连接到一个函数节点和多个值节点,并将函数应用于值arg0是列表,arg1是初始值(z)arg2是要应用的函数 它相当于下面的scheme定义(虽然我的“语言”不是scheme,但它是图形) 问题是,由于没有特殊的运算符,所以存在所有的函数,特别是如果只是一个正常函数。在这种形式下,程序永远不会终止,而是达到最大堆栈深度,因为else子句始终是

我正在尝试实现一种简单的函数式语言,用于自动程序合成。 数据结构是一个函数和值的图形,可以编译成javascript。 下图应为折叠函数
funcApp
节点连接到一个函数节点和多个值节点,并将函数应用于值
arg0
是列表,
arg1
是初始值(z)
arg2
是要应用的函数

它相当于下面的scheme定义(虽然我的“语言”不是scheme,但它是图形)

问题是,由于没有特殊的运算符,所以存在所有的函数,特别是如果只是一个正常函数。在这种形式下,程序永远不会终止,而是达到最大堆栈深度,因为else子句始终是计算出来的


我认为这个问题在某些语言中是通过延迟计算解决的。因此,我的问题是:是否有一个fold的函数版本不会有这种无限递归2)如果需要,从哪里开始考虑对这样一种简单的语言应用惰性求值。

您可以将if表达式的两个分支编译成thunk,并根据条件调用相应的thunk。如果scheme的正式定义是这样写的,我不会感到惊讶。

我认为在binders下进行评估(特别是评估lambda的主体)是非常少见的,因此我认为将严格语言惰性化的标准解决方案是引入lambda。我不知道scheme语法,但在Haskell语法中,如果您希望
x
成为严格函数
f
的惰性参数,您可以编写类似
f(\()->x)
(并适当地修改
f
以期望这样的lambda,并在您想要取消它们惰性的时候调用它们).

如果
是Scheme中的一种特殊形式,那么else表达式并不总是求值。这里的问题是什么?我知道Scheme就是这样,我想我在最后一段中非常明确地陈述了我的问题,我不理解第一个问题。2)的答案是“处理
if
specially”。@zenna:首先,不严格和懒惰是不同的。其次,Scheme通过处理
if
(与其他函数调用不同)来解决这个问题(这称为特殊形式)。您不需要像Haskell那样进行全面的惰性评估(尽管您可以在Haskell中将
if-then-else
实现为一个简单的函数)。sepp关于如果你没有一个懒惰的
if
,你就不能写
fold
(他已经删除了那条评论):你可以通过向
if
提供lambdas并调用结果来模拟这种行为。顺便说一句,我的困惑主要是因为你提出了一个“方案”事实上不是Scheme的示例:)Scheme语法与Haskell语法非常相似,
(λ()x)
是thunk,在parens中围绕thunk“调用”它,例如
(someThunk)
(define (foldr f z xs)
   (if (null? xs)
       z
       (f (car xs) (foldr f z (cdr xs)))))