是否可以在没有函数的语言中进行函数式编程?

在这篇评论中 ,有人说Ruby没有函数,只有方法。 如果Ruby没有函数,是不是可以在其中进行函数式编程? 或者我对术语“function”感到困惑?

我的意思是“函数式编程”在函数意义上作为第一类对象,而不是在禁止可变状态。

是。 方法与function相当不同。

将每个特定方法实现视为一个函数很容易; 让它作为一个额外的参数,调用该方法的对象(如果您的语言没有明确地传递它;不太熟悉Ruby)。 这并没有给你虚拟方法调用(即调用的特定实现在运行时由对象确定)。 但是,将虚拟方法调用想象为调用只检查其第一个参数( selfthis ,无论它是什么)并使用它来确定调用哪个方法实现的函数也很容易。 建立这些约定后, object.method(param1, param2)method(object, param1, param2)区别仅在于一种简单的语法方式。

就个人而言,我将上述视为“真相”,而面向对象语言只是为此提供语法糖和优化执行,因为它是编写/执行OO程序的核心部分。 当你有函数而不是真正的类/方法时,那种系统也正是你如何做OO的。

如果您认为方法不是函数,那么使用方法实现函数也很容易。 只需要一个具有单一方法且没有属性的对象! 这也是您在Java等语言中进行函数式编程的方法,它坚持将所有内容都作为对象,并且不允许您将方法/函数作为一等值传递。

需要做的函数式编程就是你可以作为一等值传递的东西,它可以用来执行由“东西”的创建者决定的代码(而不是由使用“东西”的代码决定),可以访问“事物”的代码按需访问。 我想不出没有这种function的编程语言。

Blocks和Procs是一流的function。 您可以将它们传递给方法和函数。 这就是Ruby能够支持FP-ish之类的东西,比如map和reduce。

更一般地说,一个方法可以看作是一个具有额外关联状态(它的self )的函数,但是方法很少在Ruby中传递 – 尽管它们可以是 – 所以在实践中它们对于FP-ish成语并不像块一样重要和过程。

函数(或更确切地说是一个过程,因为我们这里不讨论引用透明性)与只有一个方法的对象是同构的。

这就是Java中伪造一流程序的方式,例如:使用所谓的SAM接口(单一抽象方法)。 这也是一流程序在Ruby中“伪造”的方式:响应call (也许to_proc )的任何东西都是一流的程序。 有一个名为Proc的便利类,它提供了诸如currying之类的“过程”的附加function,并且对于创建Proc类的实例的过程有文字语法( -> (x, y) { x + y } ),但那些两个并非绝对必要:

 def (i_am_a_first_class_procedure = Object.new).call(x) px end i_am_a_first_class_procedure.(42) # 42 

Scala类似,除了方法称为apply ,而不是call 。 在Python中,它是一种名为__call__的“神奇”方法。

注意:我在这里忽略了闭包。 闭包是具有状态的过程,并且对象当然也可以具有状态,因此在表示它们时没有真正的问题,但是根据具有实例变量的对象表达自由变量的词汇捕获变得相当毛茸茸。

当然是的,只要该语言是图灵完整的。

后来添加:

实际上,Ruby支持几种典型的函数式编程。 当他在Ruby 1.9中将​​#curry方法添加到Proc类时,Matz自己也提到了“为函数式编程孩子提供玩具”,但你也可以使用方法进行函数式编程。