为什么Python不适合函数式编程?

我一直认为可以用Python完成函数式编程。 因此,我很惊讶Python在这个问题上没有提到太多的内容,当提到时,它通常不是很积极。 然而,没有给出很多理由(缺少模式匹配和代数数据类型)。 所以我的问题是:为什么Python不是很适合函数式编程? 是否有比缺少模式匹配和代数数据类型更多的原因? 或者这些概念对函数式编程如此重要,以至于不支持它们的语言只能被归类为二次函数式编程语言? (请记住,我的函数式编程经验非常有限。)


您参考的问题是询问哪种语言可以促进OO和函数式编程。 即使Python运行良好,Python也不会促进函数式编程。

在Python中反对函数式编程的最佳观点是,Guido仔细考虑了命令/ OO用例,而函数式编程用例却没有。 当我编写命令式Python时,它是我认识的最漂亮的语言之一。 当我编写函数式Python时,它会变得和没有BDFL的普通语言一样丑陋和不愉快。

这并不是说它很糟糕,只是因为如果你改用一种促进函数式编程的语言或者转向编写面向对象的Python,你必须比你更努力地工作。

以下是我在Python中错过的功能性内容:

  • 模式匹配
  • 尾递归
  • 列表功能的大型库
  • 功能字典类
  • 自动咖喱
  • 简洁的方式来组成功能
  • 懒惰列表
  • 简单,强大的表达式语法(Python的简单块语法可以防止Guido添加它)

  • 没有模式匹配和没有尾递归意味着你的基本算法必须写入命令。 递归在Python中是丑陋而缓慢的。
  • 一个小清单库和没有功能词典意味着你必须自己写很多东西。
  • 没有任何用于currying或组合的语法意味着无点式样就像显式传递参数一样充满标点符号。
  • 迭代器而不是惰性列表意味着你必须知道你是否想要效率或持久性,并且如果你想要持久性的话,将调用分散到list 。 (迭代器只使用一次)
  • Python的简单命令语法及其简单的LL1解析器意味着更好的语法if-expressions和lambda表达式基本上是不可能的。 Guido喜欢这样,我认为他是对的。

  • Guido在这里有一个很好的解释。 这是最相关的部分:

    我从来没有考虑过Python会受到函数式语言的严重影响,无论人们怎么说或想什么。 我对C和Algol 68等命令式语言更加熟悉,尽管我制作了一流的对象,但我并没有将Python看作一种功能性编程语言。 然而,早些时候,很明显,用户想要使用列表和功能做更多的事情。

    ...

    值得注意的是,尽管我没有将Python视为一种功能性语言,但是闭包的引入对于许多其他高级编程功能的开发非常有用。 例如,新式类,装饰器和其他现代特征的某些方面依赖于这种能力。

    最后,尽管多年来引入了许多功能性编程功能,但Python仍然缺乏“真正”功能性编程语言中的某些功能。 例如,Python不会执行某些种类的优化(例如,尾递归)。 一般来说,因为Python非常动态的特性,所以不可能从Haskell或ML等函数语言中进行编译时优化。 这很好。

    我从这件事中拉出两件事:

  • 该语言的创建者并不认为Python是一种功能性语言。 因此,可以看到“功能强大”的功能,但不太可能看到任何明确功能的功能。
  • Python的动态性限制了你在其他函数式语言中看到的一些优化。 当然,Lisp和Python一样动态(如果不是更动态的话),所以这只是一个部分的解释。

  • Scheme没有代数数据类型或模式匹配,但它当然是一种功能语言。 从函数式编程的角度来讨论关于Python的东西:

  • 残废的兰姆达斯。 由于Lambdas只能包含一个表达式,并且不能在表达式上下文中轻松完成所有任务,这意味着您可以“即时”定义的函数受到限制。

  • Ifs是语句,而不是表达式。 这意味着,除了别的以外,你不能在里面有一个带有If的lambda。 (这在Python 2.5中被三元组固定,但看起来很丑。)

  • Guido威胁要在一段时间内删除地图,过滤和减少每一次

  • 另一方面,python有词法关闭,Lambdas和列表解析(无论Guido是否承认它都是真正的“功能”概念)。 我在Python中做了大量的“功能风格”编程,但我很少说这是理想的。

    链接地址: http://www.djcxy.com/p/53545.html

    上一篇: Why isn't Python very good for functional programming?

    下一篇: Large data with pivot table using Pandas