7

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

除了使用 fp 样式增加代码的表达性和清晰度之外,我对以低成本加速计算的惰性求值特别感兴趣。

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

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

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

此外:

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

感谢您的输入!

4

1 回答 1

4

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

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

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

于 2010-10-04T19:10:13.313 回答