代码之家  ›  专栏  ›  技术社区  ›  sascha

了解并使用Boost Phoenix图书馆,重点是惰性评估

  •  7
  • sascha  · 技术社区  · 16 年前

    我刚刚发现了BoostPhoenix图书馆(隐藏在Spirit项目中),作为功能编程风格的粉丝(但仍然是业余爱好者,对Haskell和Scheme有一些小经验),我想和这个图书馆一起玩,了解 本库的合理应用。

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

    一个简单的小例子是: 有一种路由问题(如TSP),它使用的是欧几里得距离矩阵。我们假设,距离矩阵的某些值从未被使用过,有些值经常被使用(因此,对于每次调用,动态计算它们不是一个好主意)。现在,有一个 惰性数据结构 保持距离值。凤凰城怎么可能?(忽略了没有fp风格的编程我很容易完成的事实)阅读凤凰城的官方文档并没有让我足够理解来回答这个问题。

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

    使用一个向量和凤凰城定义的所有懒惰函数意味着什么?虽然我很幼稚,但我尝试用随机值填充两个矩阵(vector>),一个是正常的后推,另一个是boost::phoenix::后推,并尝试从这些矩阵中读取少量的值,并将它们存储在一个容器中以便打印出来。懒惰的人总是空的。我是不是用错了凤凰城/这应该是可能的?还是我误解了凤凰城集装箱/算法的功能。后者的一个小线索是fp++库中存在一个特殊的列表数据结构,它影响了Phoenix。

    另外:

    • 你用凤凰做什么?
    • 你知道一些关于凤凰城的好消息吗?(教程、博客条目…)

    感谢您的所有意见!

    1 回复  |  直到 16 年前
        1
  •  4
  •   user395760    16 年前

    根据要求,我的评论(加上一些补充和小的修改)作为答案…

    我很清楚你的立场,我也和菲尼克斯一起玩过(虽然我没有深入了解,主要是阅读Boost::Spirit教程的副产品),不久前,我发现了功能性错误,学习了基本的haskell-但我什么都没用:(这与我在黑暗环境中的一般经验是一致的)复杂的魔术:很容易被误解,搞砸和被打在脸上完全意想不到的行为或不可理解的错误信息。

    我建议你远离凤凰城一段时间。我也喜欢FP,但是C++中的FP比Haskell更易变(它们是从头到头,但是C++已经很丑陋了,Haskell是,至少根据拉里·沃尔,是有史以来最美丽的语言)。学习和使用FP,当你擅长它并强迫使用C++时,使用菲尼克斯。但是对于学习来说,一个在一个已经复杂的语言(即C++中的FP)上完全不同的范式的图书馆是不可取的。