C++ 中的定点组合器
我对使用定点组合器的实际示例感兴趣(例如 y-combinator 中C++。您是否曾经使用过 鸡蛋 或 绑定 在真实的代码中?
我发现 Egg 中的这个例子有点密集:
void egg_example()
{
using bll::_1;
using bll::_2;
int r =
fix2(
bll::ret<int>(
// \(f,a) -> a == 0 ? 1 : a * f(a-1)
bll::if_then_else_return( _2 == 0,
1,
_2 * lazy(_1)(_2 - 1)
)
)
) (5);
BOOST_CHECK(r == 5*4*3*2*1);
}
你能解释一下这一切是如何工作的吗?
是否有一个很好的简单例子,也许使用了比这个更少的依赖项?
I'm interested in actual examples of using fixed point combinators (such as the y-combinator in C++. Have you ever used a fixed point combinator with egg or bind in real live code?
I found this example in egg a little dense:
void egg_example()
{
using bll::_1;
using bll::_2;
int r =
fix2(
bll::ret<int>(
// \(f,a) -> a == 0 ? 1 : a * f(a-1)
bll::if_then_else_return( _2 == 0,
1,
_2 * lazy(_1)(_2 - 1)
)
)
) (5);
BOOST_CHECK(r == 5*4*3*2*1);
}
Can you explain how this all works?
Is there a nice simple example perhaps using bind with perhaps fewer dependancies than this one?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这是转换为
boost::bind
的相同代码,请注意主函数中的 y 组合器及其应用位置。 我希望这有帮助。Here is the same code converted into
boost::bind
notice the y-combinator and its application site in the main function. I hope this helps.fix2 是一个 y 组合器(具体来说,它是具有两个参数的函数的组合器;第一个参数是函数(用于递归的目的),第二个参数是“适当的”函数参数)。 它创建递归函数。
bll::ret(...) 似乎创建了某种形式的函数对象,其主体是
“惰性”大概是为了阻止第一个(函数)参数的无限扩展(阅读之间的区别惰性和严格 y 组合器看看为什么)。
该代码非常可怕。 拥有匿名函数固然很好,但解决 C++ 缺乏语法支持的黑客行为使它们不值得付出努力。
fix2 is a y-combinator (specifically, it is a combinator for functions with two arguments; the first argument is the function (for the purpose of recursion), the second argument is a "proper" function argument). It creates recursive functions.
bll::ret(...) appears to create some form of a function object, the body of which is
The "lazy" is presumably there to stop an infinite expansion of the first (function) argument (read up on the difference between lazy and strict y combinators to see why).
The code is quite horrible. Anonymous functions are nice to have, but the hackery to work around C++'s lack of syntactic support make them not worth the effort.