我刚刚发现了 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/