【问题标题】:Functional programming in Python and C++ [closed]Python和C++中的函数式编程[关闭]
【发布时间】:2011-05-15 03:59:43
【问题描述】:

有没有关于 Python 或 C++ 函数式编程的好书?我需要掌握这些语言的函数式编程。

【问题讨论】:

  • 您确实意识到 C++ 和 Python 都不是真正的函数式编程语言。
  • 函数式编程是一个概念。一旦掌握了它,理解语言特定的 fp 方面就会容易得多。如果您想专注于设计实用的东西,请尝试 Haskell 或更现代的 F#。
  • 我同意@darioo,尽管我认为对于学习 FP,使用纯函数式语言非常重要。不是像 F#(或 Scala 或 OCaml,就此而言)这样的 FP/OOP 组合 - 因此您无法坚持使用您知道的部分并且不学习任何东西。两个人都为 Haskell 竖起大拇指。
  • @delnan comon 不要成为那个人。有多少人在 OCaml 或 F# 中使用 OO(除互操作外)。这些都可以学习。我会推荐开始的方案,因为它比 Haskell 更容易上手。
  • @nickik:我并没有使用太多,但据我所知,(至少)OCaml 的 OO 部分 is 已使用(如果没有人使用它)。但那是那些已经知道语言和 FP 的人。尝试学习 FP 的新手不应该在他的头几周或几个月里考虑 FP 与 OOP 方法来做他所做的每一件事。

标签: c++ python functional-programming


【解决方案1】:

通过函数式编程,我假设您的意思是引用透明性(基本上,没有全局状态或副作用),以及诸如函数作为一等对象、多态类型、部分函数应用程序等。

据我所知,没有一本书涵盖 C++ 中的函数式编程。您可以在 C++ 中进行没有全局状态和副作用的编程,并且可以使用函数类型指针将函数作为参数传递,但您无法获得部分函数应用程序,也无法获得匿名 lambda 表达式。

【讨论】:

  • 建议不要犯流行的错误“FP ==匿名函数”。我也会添加代数数据类型和模式匹配 - 虽然严格来说不是一个函数概念,但它主要用于那里。
  • 你见过 boost.bind、boost.lambda 和 C++0x 吗?
  • 其实C++通过标准的std::bind1st函数支持了很长一段时间的部分函数应用(至少对于二进制函数)。在 C++0x 中,更通用的 std::bind 将适用于任何函数。通过在 C++0x 中添加适当的闭包和 Lambda,它将成为一种真正的函数式语言。但是大多数人都知道 C++(C++98 标准)不支持 lambda,而且 std::bind1st 使用起来很烦人。编辑:Fred Nurk 的 Ninja'd。 :-(
  • @Fred @Dragontamer:但老实说,没有初学者能够使用这些来学习 FP。
  • 只是对语言有恐惧和实际使用它们是不一样的。
【解决方案2】:

Text Processing in Python 使用函数式风格,这让我开始接触函数式编程。总的来说,这也是一本很棒的 Python/编程书籍,我强烈推荐它。

【讨论】:

  • 哇哦。感谢您的回答。我有这本书,但从未仔细看过。
【解决方案3】:

嗯,如果你想学习函数式编程,你应该先学习一门函数式语言以真正理解原理,然后你可以尽可能好地应用它们,这会更难。

在 python 中,您可以使用函数来修改字典,这非常实用。使用具有高阶函数的 lambda。你必须避免类和继承。

关于 C++,我真的不能说太多。也许你可以找到一些函数式数据结构,然后在这些数据结构上编写函数。寻找提供 map、reduce 等功能的库...

C++0x 应该支持闭包和柯里化(或多或少),这样事情会变得更好。

一般:

  • 尝试在库上编写不可变层(请注意,这不会很好地执行)
  • 寻找以函数方式编写的库

编辑:我会推荐学习计划,它真的很小,你可以快速上手。阅读诸如 SICP 或 Little Schemer 之类的东西,它们会教你递归思维。

【讨论】:

  • 为什么要避免类和继承? Python 中的“类”仅表示“类型”,如 [].__class__ is list
  • @Fred Nurk 您可以使用给定的类,但是如果您在类和继承更改中对程序进行建模,您将永远无法进行正确的 FP。尝试使用字典和函数而不是类和方法。
  • 小谋士不错。它的理论很重,但它可以让你探索许多你不知道的想法。
  • C++0x 不支持函数柯里化,部分应用有库支持。
【解决方案4】:

只有 C++ 的未来版本支持 lambdas /匿名函数。我猜 Boost.Lambda 支持 C++ 函数式编程,但它还不是 C++ 的一等公民。

有关函数式编程的书籍通常使用函数式语言。像 Haskell、Miranda、Lisp、Scheme、OCaml、Javascript 等等。

编辑:我暂时保留对 Python 的看法。看来我在一些事情上弄错了。

【讨论】:

  • @Dragontamer5788 感谢您的回复。你能建议我学习哪种语言 Haskell、Miranda、Lisp、Scheme、OCaml 吗?
  • @Jelena:目标是学习如何将 FP 应用于 C++ 和 Python(这就是我阅读您的问题的方式,尤其是“在那些语言中”)还是学习 FP(这就是我阅读的方式你的评论在这里)?
  • 我在 Python 问题上得到了纠正。一定是把它和另一种语言弄混了。我应该在发布之前检查一下。但是@nikow,还有什么其他误解? @Jelena 进入像 Haskell 或 OCaml 这样更“纯”的语言之一会更难,但会迫使你更多地思考功能。 Scheme 和 Lisp 更容易进入 IMO,但它们不包括类型和模式匹配。
  • @nikow,使用适当的闭包(lambda 是语法糖,但非常有用),您可以在 Lambda 演算下做所有可用的事情,IMO 是函数式编程的核心。当然,OCaml 中有很多好东西,比如模式匹配、Haskell 的惰性评估、Scheme 的 Call/cc 和 Hygenic Macros……但我不认为这些都是“函数式编程”的核心。它们非常有用,但不是函数式编程。它们恰好在函数式编程社区中很受欢迎。
  • @Dragontamer:我同意该评论的大部分内容,但认为您误解了 Python:Python 的闭包怎么不合适?您是否误解了如果任意语法限制妨碍任何 lambda 可以重写为本地函数?
【解决方案5】:

在寻找有关 Python 函数式编程的信息时,我发现这个网页非常有用:

http://www.amk.ca/python/writing/functional

引用部分包含很多粗略的信息。

如果您正在寻找一本只涉及 Python 函数式编程的书,我不知道。

C++ 更难。它具有函数式编程的许多成分(并且正在稳步获得更多),但缺乏许多其他成分。实际上,C++ 从来都不是为支持函数式编程而设计的,所以通常你可以在某些容器中使用函数式编程,但需要经常恢复到命令式编程。

【讨论】:

    【解决方案6】:

    虽然不是一本书,但这是一个至少可以让您开始做一些事情的网站。 http://www.ibm.com/developerworks/library/l-prog.html

    就真正理解函数式编程而言,我建议使用“The Little Schemer”之类的东西来快速了解方案。然后,您可以将这些想法应用到 python。

    【讨论】:

      【解决方案7】:

      对于 Perl,我可以推荐“Higher Order Perl”。

      虽然不了解 Python 或 C++。

      【讨论】:

        猜你喜欢
        • 2010-10-06
        • 2011-11-16
        • 2022-06-15
        • 1970-01-01
        • 1970-01-01
        • 2010-11-19
        • 2010-09-06
        • 2010-11-06
        相关资源
        最近更新 更多