10

我一直在研究 C++11 中的新特性,看起来真的可以使用它以非常函数式的编程风格进行编程。我已经习惯了在 F# 中使用 List、Seq、Array 类型,而且我看不出为什么它们的成员不能被移植到某种 C++11 模板中。在使用 C++11 与 F# 之类的混合函数式编程风格时,您看到了哪些问题或优势?functional一旦 C++11 出现,也许 Boost 家伙会做出新的。

4

5 回答 5

15

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

于 2009-07-06T21:16:53.063 回答
6

以下是我在尝试用 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++ 爱好者。然后我开始使用带有模板的泛型编程和使用函数对象的高阶函数。只是写得太累了。在我尝试了一种函数式语言之后,我再也没有回头。

于 2012-04-28T21:52:17.707 回答
5

你可能会觉得这很有趣:

http://smellegantcode.wordpress.com/2009/01/26/linq-to-c0x/

于 2009-07-06T21:19:44.103 回答
3

在使用 c++0x 与 f# 之类的混合函数式编程风格时,您看到了哪些优势问题?

40 年前在 Lisp 的背景下讨论过的向上的 funarg 问题!

于 2011-11-07T23:09:29.687 回答
0

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

于 2009-07-06T21:08:08.713 回答