问题标签 [fixpoint-combinators]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
122 浏览

haskell - Haskell“修复”关键字在声明递归 lambda 函数时失败

似乎一个函数应该有一个递归的名称(为了调用自己),那么 lambda 函数如何递归?

我搜索了维基百科,它说这可以通过“Y-combinator”来完成。我没有太多的数学理论背景,它只是告诉我“Y-combinator”是 Haskell 自己发现的。在 Haskell 语言中称为“修复”关键字,我尝试过:

似乎失败了,但是如何使用“修复”关键字来完成我的预期?

0 投票
1 回答
116 浏览

haskell - 什么是固定点?

最近的一张最好匿名的海报试图实现这样的阶乘函数:

这显然效果不太好。但后来我想知道:我可以让它通过类型检查器吗?它的类型会揭示什么?

0 投票
1 回答
110 浏览

haskell - Haskell 类型和修复递归示例

在阅读有关修复时,因为我对在我的代码中使用递归 lambdas 感兴趣,所以我遇到了这个特定的代码示例(来自Here):

现在忽略 fix 的类型签名,我觉得那段代码有问题:

修复(a -> a) -> a的类型是 lambda 的类型是(a -> a) -> a -> a我确定我读错了这段代码,但我第一次阅读它的方式是“修复应用于两个参数”这是错误的,因为修复只接受一个参数,一个函数(a -> a),一定有我明显遗漏的东西。

然后,我查看了 lambda 的类型和修复的类型,在我看来“等等,不是有很大的不匹配吗?我可以理解,使用 curried 函数,您可以将类型为a -> a -> a参数不足的函数提供给创建一个新函数,但在这里我正在(a -> a) -> a -> a(a -> a) -> a函数提供数据,似乎我试图让大象通过针孔,将错误的参数提供给修复函数。

我的内部解析器和类型检查器(brain 1.0)在评估这一行时哪里出错了?

0 投票
4 回答
913 浏览

functional-programming - 在继续传递样式中定义定点组合器

  • 定点组合器是引入递归的非常有用的工具。
  • Continuation-Passing 风格是一种 lambda 演算风格,其中函数永远不会返回。相反,您将程序的其余部分作为 lambda 参数传递给您的函数并继续执行它们。它使您可以更好地控制执行流程并更轻松地定义各种流程更改结构(循环、协程等)

但是,我想知道您是否可以用另一种方式表达?我见过的所有 CPS 风格的语言都有一个明确的FIX结构来定义递归。

  • 是因为不可能在普通 CPS 中定义定点组合器(或类似的),没有FIX?如果是这样,你知道这件事的证据吗?
  • 或者仅仅是因为打字问题?
  • 或者也许这是可能的,但由于某种原因不切实际?
  • 或者我根本没有找到一个解决方案......?

我希望类似 Y-combinator 的 CPS 函数CPSY可以这样工作:如果我定义一个 Y-ready CPS 函数,例如:

然后我会将它放入CPSY以产生一个递归到自身的函数:

CPSY应该是一个简单的延续传递风格的函数,它本身不依赖于任何递归。Y-combinator 可以在没有内置递归的普通 lambda 演算中以这种方式定义。它也能以某种形式存在于 CPS 中吗?


重申一下:我正在寻找一个类似组合器的函数CPSY

  • 将启用 CPS 函数的递归
  • 它的定义不依赖递归
  • 它的定义以连续传递样式给出(在 的主体内任何地方都没有返回 lambda CPSY
0 投票
1 回答
98 浏览

haskell - 固定点功能找不到我的固定点

为了理解fix函数,从Control.Monad.Statefix :: (a -> a) -> a,我在 中有这个小代码modifyValue,它递增一个整数直到 49,然后函数总是返回 50。

但是,当我启动此代码时,而不是在 50 处找到固定点,序列收敛到 50... 它声称*** Exception: <<loop>>

很明显,我犯了一些错误,因为我没有提供初始状态来启动序列,例如使用 1,这会生成[2,3,4,..,49,50,50,50,50....]

我是否不恰当地使用了修复功能?有什么办法可以找到固定点 50 吗?

0 投票
1 回答
95 浏览

haskell - 猜测定点组合器的类型

我的问题与“定点组合器”有关。根据this Wikipedia page section的功能fix

是类型(或至少可以是类型)

有人可以解释我为什么吗?

0 投票
3 回答
1363 浏览

haskell - 为什么这个版本的“修复”在 Haskell 中更有效?

在 Haskell 中,这是一个固定点的简单(朴素)定义

但是,这是 Haskell 实际实现它的方式(更高效)

我的问题是为什么第二个比第一个更有效?

0 投票
1 回答
439 浏览

haskell - 如何使用 Y-Combinator;为什么这个无限递归返回 9?

Y - 组合器

我一直在尝试了解 Y-Combinators (对此的解释也很可爱),并从这个wiki遇到了一个例子。在 Haskell 或 Python 中对该主题进行深入的解释将不胜感激。请!

代码

问题

调用的函数在应用于时fix返回,我不知道为什么;当我跟随我想象的堆栈时。9fix(\x -> 9)f(f ... (fix f) ...)

0 投票
1 回答
272 浏览

haskell - 找到函数的最小不动点

如果我有这个 Haskell 函数:

考虑以下 Haskell 函数f

那么如何计算它的固定点最小固定点(封闭形式)?

这个问题的答案是:

在此处输入图像描述

这个最小固定点是如何计算的?我试图理解这一点,但仍然没有运气。如果有人可以向我解释这一点,那就太好了。

0 投票
1 回答
124 浏览

haskell - 为什么 haskell 的 `fix` 似乎对元组有问题?

我试图围绕固定点和递归定义弯曲我的头。

这有效:

这做同样的事情,考虑到 的定义,这是有道理的fix

现在假设我开始使用递归定义的对:

好吧,我应该也能写出来fix,对吧?

但它不起作用。除非我做出以下看似微不足道的改变:

最后两个示例之间的关键区别是什么?