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

sas*_*cha 7 c++ functional-programming lazy-evaluation boost-spirit boost-phoenix

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

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

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

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

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

另外:

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

感谢您的输入!

小智 4

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

我确切地知道你的立场,不久前,在发现功能错误并学习基本的 Haskell 之后不久,我也玩过 Phoenix(虽然我没有深入研究,主要是阅读 Boost::Spirit 教程的副产品) - 我没有得到任何工作:(顺便说一句,这与我对黑暗模板魔法的一般经验是同步的:非常容易误解、搞砸并因完全意想不到的行为或难以理解的错误消息而被打脸。

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

  • (-1) FP 在 C++ 中很漂亮,编译器技术和 C++ 标准正在不断发展,使 FP 在 C++ 中成为一等公民。C++ FP 生成高效的代码,而不需要运行时执行引擎。我怀疑你被误导了,没有尝试过愤怒地使用C++ FP,并在第一个障碍时转身。C++ 是为现实世界的系统设计而设计的,拥有可用于解决现实世界问题的 FP 比没有它更好......首先理解并编写正确的 C++ FP 代码,你就不会陷入深奥编译器消息。 (4认同)