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

gra*_*bot 10 c++ f# functional-programming c++11

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

Chr*_*her 15

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

  • 这是真的.无论编译器可以做什么作为优化,该语言都不提供此功能的设施,因此取决于它是危险的. (3认同)
  • 不完全正确.今天最流行的C++编译器将正确处理尾递归,但可能需要您指定额外的优化标志,如'-O2'. (2认同)

Joh*_*Joh 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. 缺乏计算表达式,包括序列表达式,理解,异步......

如果使用一些模板和预处理器魔术在C++中实际上可以实现这些点中的几个,那就不会让我感到惊讶,但除非你有非常冒险和宽容的同事,否则你不能在生产环境中真正使用它们.

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