理解并使用Boost Phoenix Library,重点关注延迟评估

时间:2010-10-03 11:58:12

标签: c++ functional-programming lazy-evaluation boost-spirit boost-phoenix

我刚刚发现了Boost Phoenix库(隐藏在Spirit项目中)以及作为函数式编程风格的粉丝(但仍然是业余爱好者;对于haskell和scheme的一些小经验)我想玩这个库,了解 此库的合理应用程序。

除了使用fp-style提高代码的表现力和清晰度之外,我特别 对延迟评估感兴趣,以便以低成本加速计算。 < / p>

一个小而简单的例子如下: 存在某种路由问题(如tsp),它使用的是eucliedean距离矩阵。我们假设,距离矩阵的某些值从未使用过,而且有些值经常使用(因此,为每次调用动态计算它们并不是一个好主意)。现在,保持距离值的 懒惰数据结构 似乎是合理的。凤凰怎么可能呢? (忽略了这样一个事实,即在没有fp风格编程的情况下我很容易就完成了)阅读凤凰的官方文档并没有让我理解得足以回答这个问题。

有可能吗? (例如,在Haskell中,创建thunk的能力保证了以后可以计算的值是语言的核心)。

使用具有凤凰中定义的所有惰性函数的向量是什么意思?像我一样天真,我试图用随机值填充两个矩阵(向量&gt;),一个用普通的push_back填充,另一个用boost :: phoenix :: push_back,并试图从这些中只读出少量的值矩阵并将它们存放在容器中以便打印出来。懒惰的人总是空着的。我是以错误的方式使用凤凰/应该可以吗?或者我误解了凤凰中容器/算法的功能。后者的一个小线索是FP ++库中存在一个特殊的列表数据结构,它影响了凤凰。

此外:

  • 你在用凤凰做什么?
  • 你知道一些关于凤凰的好资源吗? (教程,博客条目......)

感谢您的所有投入!

1 个答案:

答案 0 :(得分:4)

根据要求,我的评论(添加和小修改)作为答案......

我完全了解你的位置,我也曾经和菲尼克斯一起玩过(虽然我没有深入挖掘,主要是阅读Boost :: Spirit教程的副产品),不久前,在捕捉到功能性错误之后不久学习基本的Haskell - 我没有得到任何工作:(这是与我的黑暗模板魔术的一般经验同步:非常容易误解,搞砸,并在完全出乎意料的行为或难以理解的错误信息面对面打了一拳。

我建议你长时间远离凤凰城。我也喜欢FP,但是C ++中的FP甚至比Haskell中的可变性更加丑陋(它们是头对头但是C ++已经很难看了,而Haskell,至少根据Larry Wall来说,这是有史以来最美丽的语言;))。学习和使用FP,当你擅长并强制使用C ++时,请使用Phoenix。但是对于学习来说,不建议在已经很复杂的语言(即C ++中的FP)上使用完全不同的范例的库。