105得票5回答
我该如何使用fix,并且它是如何工作的?

我对fix的文档有点困惑(虽然现在我认为我已经理解它应该做什么了),所以我查看了源代码。这让我更加困惑:fix :: (a -> a) -> a fix f = let x = f x in x 这个函数如何返回一个定点数? 我决定在命令行中试一下:Prelude Data.Fu...

17得票3回答
letrec有什么好处?

我在阅读《经验丰富的Schemer》时学习了关于letrec的知识。我理解它的作用(可以使用Y组合子进行复制),但该书中使用它来替代对静态参数执行的已defined函数上的递归。 一个使用已defined函数自身递归的旧函数示例(没有什么特别之处):(define (substitute n...

16得票16回答
哪些编程语言支持递归函数文字/匿名函数?

似乎现在有很多主流语言支持函数字面量。它们也被称为匿名函数,但我不关心它们是否有名称。重要的是,函数字面量是一个表达式,它产生一个函数,该函数在其他地方尚未定义,因此例如在C中,&printf不算。 编辑添加:如果您有一个真正的函数字面量表达式<exp>,则应该能够将其传...

12得票1回答
在Scala中使用letrec?(一种不可变的“打结”方式?)

假设我有一个非常简单的case类,像这样: case class Foo(name: String, other: Foo) 我该如何定义a和b,使得a.other等于b,b.other等于a,并且这两个变量是不可变的?Scala是否提供了类似于"tying the knot"的方法?我...

10得票2回答
转换计算固定点的函数

我有一个函数,它按迭代计算一个不变点:equivalenceClosure :: (Ord a) => Relation a -> Relation a equivalenceClosure = fst . List.head -- "guarante...

9得票2回答
Scheme/Racket中letrec的含义

据我所知,以下内容:let、let*、letrec 和 letrec* 是Scheme/Racket中使用的合成糖。现在,如果我有一个简单的程序: (let ((x 1) (y 2)) (+ x y)) It is translated into: ((lambd...

8得票1回答
为什么使用阴影`let`绑定的这段代码会挂起?

运行以下代码: j = let x = 4 in let x = x * x in x 在解释器中: ghci> j ... no response ... 为什么CPU使用率很低就会出现卡顿?我预期的是j = 16。

8得票3回答
共享和非共享的不动点组合子

这是Haskell中固定点组合子的通常定义: fix :: (a -> a) -> a fix f = let x = f x in x 在 https://wiki.haskell.org/Prime_numbers 上,他们定义了一个不同的不动点组合子: _Y ::...

7得票2回答
如何在不使用"set!"的情况下实现"letrec"?

如何在不使用set!的情况下实现letrec? 看起来,set!是一种命令式编程构造,在使用它时,会失去函数式编程的好处。