问题标签 [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.
haskell - Haskell“修复”关键字在声明递归 lambda 函数时失败
似乎一个函数应该有一个递归的名称(为了调用自己),那么 lambda 函数如何递归?
我搜索了维基百科,它说这可以通过“Y-combinator”来完成。我没有太多的数学理论背景,它只是告诉我“Y-combinator”是 Haskell 自己发现的。在 Haskell 语言中称为“修复”关键字,我尝试过:
似乎失败了,但是如何使用“修复”关键字来完成我的预期?
haskell - 什么是固定点?
最近的一张最好匿名的海报试图实现这样的阶乘函数:
这显然效果不太好。但后来我想知道:我可以让它通过类型检查器吗?它的类型会揭示什么?
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)在评估这一行时哪里出错了?
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
)
haskell - 固定点功能找不到我的固定点
为了理解fix
函数,从Control.Monad.State
,fix :: (a -> a) -> a
,我在 中有这个小代码modifyValue
,它递增一个整数直到 49,然后函数总是返回 50。
但是,当我启动此代码时,而不是在 50 处找到固定点,序列收敛到 50... 它声称*** Exception: <<loop>>
很明显,我犯了一些错误,因为我没有提供初始状态来启动序列,例如使用 1,这会生成[2,3,4,..,49,50,50,50,50....]
我是否不恰当地使用了修复功能?有什么办法可以找到固定点 50 吗?
haskell - 为什么这个版本的“修复”在 Haskell 中更有效?
在 Haskell 中,这是一个固定点的简单(朴素)定义
但是,这是 Haskell 实际实现它的方式(更高效)
我的问题是为什么第二个比第一个更有效?
haskell - 如何使用 Y-Combinator;为什么这个无限递归返回 9?
Y - 组合器
我一直在尝试了解 Y-Combinators (对此的解释也很可爱),并从这个wiki遇到了一个例子。在 Haskell 或 Python 中对该主题进行深入的解释将不胜感激。请!
代码
问题
调用的函数在应用于时fix
返回,我不知道为什么;当我跟随我想象的堆栈时。9
fix
(\x -> 9)
f(f ... (fix f) ...)
haskell - 为什么 haskell 的 `fix` 似乎对元组有问题?
我试图围绕固定点和递归定义弯曲我的头。
这有效:
这做同样的事情,考虑到 的定义,这是有道理的fix
:
现在假设我开始使用递归定义的对:
好吧,我应该也能写出来fix
,对吧?
但它不起作用。除非我做出以下看似微不足道的改变:
最后两个示例之间的关键区别是什么?