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

时间:2012-09-05 23:01:01

标签: ruby function functional-programming

this comment中,有人说Ruby没有函数,只有方法。如果Ruby没有函数,是不是可以在其中进行函数式编程?或者我对“功能”一词感到困惑?

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

4 个答案:

答案 0 :(得分:6)

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

更一般地说,方法可以被视为具有额外关联状态的函数(其self),但是方法很少在Ruby中传递 - 尽管它们可以是 - 所以在实践它们对FP-ish习语不如块和过程那么重要。

答案 1 :(得分:4)

是。方法与功能相当不同。

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

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

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

所有你需要进行函数式编程是你可以作为一等值传递的东西,它可以用来执行由“东西”的创建者决定的代码(而不是由使用“东西”的代码,可以访问“东西”的代码。我想不出没有具有此功能的编程语言。

答案 2 :(得分:2)

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

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

def (i_am_a_first_class_procedure = Object.new).call(x) p x end

i_am_a_first_class_procedure.(42)
# 42

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

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

答案 3 :(得分:-2)

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

稍后添加:

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