c++ - 理解和使用 Boost Phoenix 库,重点放在惰性求值上

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

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

除了使用 fp-style 提高代码的表现力和清晰度外,我还对以低成本加速计算的惰性求值特别感兴趣。

一个小而简单的例子如下: 存在某种路由问题(如 tsp),它使用欧氏距离矩阵。我们假设,距离矩阵的某些值从未使用过,而某些值经常使用(因此每次调用都即时计算它们并不是一个好主意)。现在,拥有一个保存距离值的惰性数据结构似乎是合理的。凤凰怎么可能? (忽略了一个事实,即我根本不需要 fp-style-programming 就可以轻松完成)阅读 phoenix 的官方文档并没有让我理解到足以回答这个问题。

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

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

另外:

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

感谢您的参与!

最佳答案

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

我很清楚你的立场,我也玩过 Phoenix(虽然我没有深入挖掘,主要是阅读 Boost::Spirit 教程的副产品)不久前,在发现功能性错误和学习基本的 Haskell - 但我没有得到任何工作 :( 顺便说一句,这与我对黑暗模板魔术的一般经验同步:很容易被误解,搞砸并因完全意外的行为或难以理解的错误消息而被打脸。

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

关于c++ - 理解和使用 Boost Phoenix 库,重点放在惰性求值上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3849626/

相关文章:

c++ - 动态创建 DateTimeAxis QML 图表 SplineSeries

c++ - winsock2重新定义合并问题

python - Reduce 给出错误,而 for 循环工作正常

functional-programming - 状态单子(monad)的目的是什么?

python - 评估 python 中的列表理解

android - 如何清除缓存Android

c++ - FindFirstVolume 不返回 EFI 系统分区

c++ - 使用 Qt C++ 读取 CSS 文件

clojure - 在文件处理任务中使用正确的功能风格

wolfram-mathematica - Mathematica 7 是否支持惰性求值?