一个常规函数在其定义中可以包含对自身的调用,这没有问题。但是我无法想象如何使用lambda函数实现这一点,因为lambda函数没有名称可以引用回来。有没有办法做到这一点?怎么做呢?
有谁能给出“组合子”(如 Y-组合子等,而不是指该公司)的良好解释吗? 我正在寻找一位为实用程序员提供解释的人,他们了解递归和高阶函数,但并没有很强的理论或数学背景。 (注:我在谈论这些东西)
是否可能在Haskell中编写Y Combinator? 这似乎会产生无限递归类型。 Y :: f -> b -> c where f :: (f -> b -> c) 或者其他什么。即使是一个简单的稍微分解的阶乘。 factMaker _ 0 = 1 f...
在几乎所有的例子中,ML类型语言中的Y组合子被写成这样:let rec y f x = f (y f) x let factorial = y (fun f -> function 0 -> 1 | n -> n * f(n - 1)) 这个代码可以正常运行,但是使用 let...
最近我在阅读一些有关函数式编程的内容,尝试理解Y组合子。我了解到,您可以使用Y组合子在不直接支持递归的语言中有效地实现递归。然而,我可能会使用的每种语言都已经支持递归,所以我不确定使用Y组合器会有多大用处。 是否有更好的Y组合器实际应用例子? 有没有人真正在实际生产代码中使用过Y组合器?还是...
所以,我花了很多时间阅读和重读The Little Schemer第9章的结尾部分,其中应用Y组合器来开发length函数。我认为我的困惑归结为一个对比两个版本length函数的陈述(在组合器被分解之前):A: ((lambda (mk-length) (mk-length mk...
我正在尝试弄清如何在一行中编写递归函数(例如阶乘,尽管我的函数要复杂得多)。为了做到这一点,我想使用Lambda演算的Y组合子。以下是第一个定义:Y = λf.(λx.f(x x))(λx.f(x x)) 这里是简化后的定义:Y g = g(Y g) 我试着用C#写成了这样:// Origin...
为什么这个函数的类型是 (a -> a) -> a? Prelude> let y f = f (y f) Prelude> :t y y :: (t -> t) -> t 它不应该是一个无限/递归类型吗? 我本来想试着表达一下我认为它的类型应该是什么,但出于某些...
有没有一种通过高阶函数“包装”递归函数的方法,使得递归调用也被包装?(例如在每次调用时记录函数参数。) 例如,假设我们有一个叫做sum()的函数,它通过将头部与尾部的和相加来返回数字列表的总和: function sum(a) { if (a.length === 0) { ...
我无法理解Y组合器,因此尝试编写一个函数,使其无需本地实现即可实现递归。经过一些思考后,我得到了以下代码:Y = λx.(λv.(x x) v) 比实际长度短:Y = λf.(λx.f (x x)) (λx.f (x x)) 然后,令我惊讶的是,它起作用了。以下是一些示例:// JavaScr...