Ruby是一种function性语言吗?

维基百科说Ruby是一种function性语言,但我不相信。 为什么或者为什么不?

我绝对认为你可以在Ruby中使用function风格。

能够在function风格中编程的最关键的方面之一是,如果语言支持Ruby的高级function。

也就是说,在Ruby中以非function性风格编程也很容易。 function风格的另一个关键方面是不具有状态,并且具有对于给定的一组input始终返回相同值的真实math函数。 这可以在Ruby中完成,但是在语言中没有像Haskell那样更强大的function。

所以,是的,它支持function风格,但它也会让你在非function风格上编程。

语言是否是function语言并不重要。 函数式编程是一篇由Philip Wadler(函数式编程的本质)和John Hughes(为什么函数式编程问题)最好地解释的论文。

一个有意义的问题是,Ruby如何才能实现函数式编程的主题呢? 答案是“非常糟糕”。

我刚才就这个问题谈了一会儿。 这里是幻灯片。

Ruby确实支持更高级别的function(请参阅Array#map,inject和select),但它仍然是一个必需的,面向对象的语言。

函数式语言的关键特征之一是它避免了可变状态。 函数式语言不像Ruby,C,Java或任何其他命令式语言那样具有variables的概念。

function语言的另一个关键特征是它关注于用“什么”而不是“如何”定义一个程序。 当用OO语言编程时,我们编写类和方法来隐藏“what”(类/方法名)的实现(“how”),但最终这些方法仍然使用一系列语句来编写。 在function语言中,即使在最低级别,也不要指定执行顺序。

我认为支持,或者有能力以function性的语言进行编程并不是function性的语言。

如果我想在几个月内伤害我的同事和我自己,我甚至可以用function性的风格编写Java代码。

拥有一种function性的语言不仅仅是你能做什么,比如高级function,一streamfunction和咖喱。 这也是关于你不能做什么的,就像纯粹function的副作用一样。

这一点很重要,因为它是function程序的原因的重要组成部分,或者function代码更容易推理。 而且,当代码更容易推理时,bug变得越来越浅,并浮动到可以固定的概念表面,这反过来又减less了错误代码。

Ruby的核心是面向对象,所以尽pipe它对function风格有相当好的支持,但它本身并不是一种function语言。

无论如何,这是我的非科学观点。

编辑:回想起来,考虑到迄今为止我已经收到的好评,我认为面向对象与function对比是苹果和橘子之一。

真正的区别在于执行中是否有影响力。 函数式语言的expression方式是其主要的语言结构,而执行顺序通常是未定义的或被定义为懒惰的。 严格执行是可能的,但只有在需要时才使用。 在一个有冲击力的语言中,严格的执行是默认的,而懒惰的执行是可能的,但是在很多边界情况下,通常是做的并且会有不可预知的结果。

现在, 这是我的非科学观点。

Ruby是一种支持编程风格的多范式语言。

Ruby将不得不满足以下要求才能“无用”function。

不可变的值:一旦设置了“variables”,就不能改变。 在Ruby中,这意味着你必须有效地处理像常量这样的variables。 该语言不完全支持,您将不得不手动冻结每个variables。

没有副作用:当传递一个给定的值时,一个函数总是返回相同的结果。 这与具有不可改变的价值观是一致的。 一个函数永远不会取值并对其进行修改,因为这会导致与返回结果相切的副作用。

高阶函数:这些函数允许函数作为参数,或使用函数作为返回值。 这可以说是任何function语言中最重要的特征之一。

Currying:由高级函数启用,currying将一个函数转换为一个函数,该函数将多个参数转换为一个函数,该函数接受一个参数。 这与部分函数应用程序结合在一起,它将一个多参数函数转换成一个函数,而这个函数本来只需要较less的参数。

recursion:通过从本身内部调用函数来循环。 当你无法访问可变数据时,recursion用于构build和链式数据构build。 这是因为循环不是一个function概念,因为它需要传递variables来存储给定时间的循环状态。

懒惰评估或延迟评估:延迟值的处理直到实际需要的时候。 例如,如果您有一些代码生成了启用了延迟评估的斐波那契数列表,那么直到结果中的一个值被另一个函数(例如puts)需要时,才会真正处理和计算这些代码。

build议(只是一个想法)我会很高兴有一种定义,有一个mode指令来声明文件的function范式,例如

模式“function”

Ruby是一种面向对象的语言,可以支持其他范式(function性,命令性等)。 但是,由于Ruby中的所有东西都是一个对象,所以它主要是OO语言。

例:

“hello”.reverse()=“olleh”,每个string都是一个string对象实例,依此类推。

在这里或这里阅读

这取决于你对“function语言”的定义。 就个人而言,我认为这个词本身就是一个绝对的问题。 作为一种“function性语言”,更多方面不仅仅是语言function,更多取决于你在哪里寻找。 例如,围绕这种语言的文化在这方面是相当重要的。 它是否鼓励function风格? 那可用的库怎么样? 他们是否鼓励你以function性的方式使用它们?

例如,大多数人会称Scheme为一种function性语言。 但是Common Lisp呢? 除了多/单名称空间问题和保证的tail-call消除(一些CL实现支持以及编译器设置)之外,没有太多的东西让Scheme作为一种更适合function编程的语言而不是Common Lisp,而且大多数Lispers不会把CL称为函数式语言。 为什么? 因为围绕它的文化在很大程度上取决于CL的必要特征(比如LOOPmacros,大多数Schemers可能会对此不以为然)。

另一方面,C程序员可能会认为CL是一种function语言。 毕竟,用Lisp方言编写的大部分代码在风格上肯定比通常的C代码块更具function性。 同样,与Haskell相比,Scheme更是一种强制性的语言。 因此,我不认为会有一个确定的答案。 是否要调用一个语言function很大取决于你的观点。

我想,Ruby也不是一个多范式的语言。 人们往往习惯于将自己喜欢的语言标记为在许多不同领域有用的东西。

我会描述Ruby是一种面向对象的脚本语言。 是的,函数是一stream的对象(有点),但这并不是真正的function语言。 国际海事组织,我可以补充

recursion在函数式编程中很常见。 几乎任何语言都支持recursion,但是如果没有尾部调用优化(TCO),recursionalgorithm通常是无效的。

函数式编程语言能够优化尾recursion,并且可以在恒定的空间中执行这样的代码。 一些Ruby实现可以优化尾recursion,另一些则不需要,但总的来说,Ruby实现不需要执行TCO。 请参阅Ruby是否执行尾巴呼叫优化?

所以,如果你写一些Ruby的function风格,并依赖于某个特定实现的TCO,那么你的代码在另一个Ruby解释器中可能是非常无效的。 我想这就是为什么Ruby不是一种function性语言(Python也不是)。

严格地说,将一种语言描述为“function性”是没有意义的。 大多数语言都可以进行函数式编程。 即使是C ++。

函数式或多或less是命令式语言特征的一个子集,支持语法糖和一些编译器优化,如不变性和尾recursion展平,

后者可以说是一个较小的实现特定的技术性,与实际的语言无关。 x64 C#4.0编译器执行尾recursion优化,而x86的编译器不会出于任何愚蠢的原因。

语法糖通常可以在某种程度上被解决,特别是如果语言具有可编程的预编译器(即C的#define)。

问“语言是否支持命令式编程?”可能稍微有意义一些,例如Lisp的答案是“否”。

请看看这本书的开头: “伟大的ruby电子书” 。 它讨论了你所要求的非常具体的话题。 你可以在Ruby中做不同types的编程。 如果你想像function编程,你可以做到这一点。 如果你想像命令那样编程,你可以做到。 这是一个Ruby定义的问题,到底是如何实现的。 请查看用户camflan的回复。