C ++ 11中的函数式编程,F#风格

时间:2009-07-06 21:06:01

标签: c++ c++11 f# functional-programming

我一直在研究C ++ 11中的新功能,看起来很可能使用它编写一个非常实用的编程风格。我已经习惯在F#中使用List,Seq,Array类型,我看不出为什么他们的成员无法移植到某种C ++ 11模板中。对于混合函数式编程风格,您在使用C ++ 11与F#之类的东西中看到了哪些问题或优势?一旦C ++ 11出现,也许Boost人会创建一个新的functional

5 个答案:

答案 0 :(得分:15)

在C ++中尝试使用函数式编程的最大问题是它不支持尾递归。在函数式语言中,当你正确地拖尾时,你不必担心堆栈爆炸,但在C ++中,你总是要担心这一点。因此,许多“功能”类型算法将是笨拙或沉重的。

答案 1 :(得分:5)

答案 2 :(得分:5)

以下是我在C#中编写函数代码时遇到的一些问题,还有我在使用C ++时的一些好处:

  1. 缺乏模式匹配。一旦你习惯了它,没有它可以让我发疯。
  2. 元组缺乏语法糖。
  3. 缺少一次复制记录和设置字段的语法。
  4. 缺少列表和数组的语法。这适用于构造函数和模式匹配。
  5. 没有GC和不安全的内存访问。不受GC的限制是一个优势,但是记住我从第一次运行Valgrind C ++代码时得到的报告,我认为它是无错误的,一直吓到我。
  6. 所有凡人都无法完全理解模板代码。我没有理解我的问题,但每当我查看STL,boost或cgal的实现时,我发现自己想知道他们使用的是什么语言。我的C ++和他们的C ++并不存在于同一个世界中。
  7. 处理使用其他版本的boost(或任何使用模板的库)的库时,完全没有乐趣。
  8. 单独的标头/实施文件的详细程度。
  9. C ++中的类型推断并不像F#。我知道它在C ++ 11中得到了改进,但据我所知,它与C#中的var类似,一旦你尝到了F#式推理,这还不够。
  10. 缺少计算表达式,包括序列表达式,理解,异步......
  11. 如果使用一些模板和预处理器魔法在C ++中实际可能有几个这些点,我不会感到惊讶,但除非你有非常冒险和宽容的同事,否则你不能在生产环境中真正使用它们。

    之前我是一个顽固的C ++爱好者。然后我开始使用通用编程与模板和使用函数对象的高阶函数。写作太烦人了。在我尝试了一种功能语言后,我再也没有回头。

答案 3 :(得分:3)

  

对于混合函数式编程风格,使用c ++ 0x与f#之类的东西有什么优势?

upward funarg problem,40年前在Lisp的背景下进行过辩论!

答案 4 :(得分:0)

我想,实现C ++ 0x中函数式语言常见的某些优化(如常见的子表达式消除)会很有趣......