当前位置:  开发笔记 > 编程语言 > 正文

C++中的定点组合子

如何解决《C++中的定点组合子》经验,为你挑选了2个好方法。

我对使用定点组合器的实际例子很感兴趣(例如C++中的y-combinator.你有没有使用带有egg的固定点组合器或绑定真实的实时代码?

我在蛋中发现这个例子有点密集:

void egg_example()
{
    using bll::_1;
    using bll::_2;

    int r =
        fix2(
            bll::ret(
                // \(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);
}

你能解释一下这一切是怎么回事吗?

是否有一个很好的简单例子,或许使用bind可能比这个更少的依赖?



1> Ted..:

这是相同的代码转换为boost::bind通知y-combinator及其主要功能中的应用程序站点.我希望这有帮助.

#include 
#include 
#include 

// Y-combinator compatible factorial
int fact(boost::function f,int v)
{
  if(v == 0)
    return 1;
  else
    return v * f(v -1);
}

// Y-combinator for the int type
boost::function
    y(boost::function,int)> f)
{
  return boost::bind(f,boost::bind(&y,f),_1);
}


int main(int argc,char** argv)
{
  boost::function factorial = y(fact);
  std::cout << factorial(5) << std::endl;
  return 0;
}



2> 小智..:
#include 
#include 

template 
auto y (std::function f) -> std::function
{
    return std::bind(f, std::bind(&y, f), std::placeholders::_1);
}

int main(int argc,char** argv)
{
    std::cout << y < std::function, int> ([](std::function f, int x) {
        return x == 0 ? 1 : x * f(x - 1);
    }) (5) << std::endl;
    return 0;
}

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有