Ruby是功能语言吗?
维基百科说Ruby是一种功能语言,但我不相信。为什么或者为什么不?
解决方案
Ruby是一种多范例语言,支持编程的功能样式。
我认为Ruby并不是真正的多范式语言。希望将自己喜欢的语言标记为在许多不同领域有用的语言的人倾向于使用多范式。
我将描述Ruby是一种面向对象的脚本语言。是的,函数是一流的对象(或者类似的对象),但这并不能使它真正成为一种功能语言。 IMO,我可能会补充。
我绝对可以认为我们可以在Ruby中使用功能样式。
能够以功能样式进行编程的最关键方面之一是该语言是否支持高阶函数... Ruby就是这么做的。
也就是说,以非功能风格使用Ruby编程也很容易。函数样式的另一个关键方面是不具有状态,而具有真正的数学函数,对于给定的一组输入,它们总是返回相同的值。这可以在Ruby中完成,但是并不能像Haskell这样功能更严格的语言强制执行。
因此,是的,它支持功能样式,但是它也将使我们也可以使用非功能样式进行编程。
Ruby是一种面向对象的语言,可以支持其他范例(功能,命令式等)。但是,由于Ruby中的所有内容都是对象,因此它主要是一种OO语言。
例子:
" hello" .reverse()=" olleh",每个字符串都是一个字符串对象实例,依此类推。
在这里或者这里阅读
我认为,支持或者具有以一种功能风格的语言进行编程的能力不是功能语言。
如果我想伤害我的同事,甚至几个月自己,我什至可以以功能风格编写Java代码。
拥有功能性语言不仅与我们可以做什么有关,例如高阶函数,一流函数和currying。这也关乎我们无法做的事情,例如纯函数的副作用。
这很重要,因为这是功能程序或者通用功能代码更易于推理的很大一部分原因。而且,当代码更易于推理时,错误会变得更浅,并浮到可以修复的概念性表面,从而减少了错误代码。
Ruby的核心是面向对象的,因此,尽管它对功能样式具有相当好的支持,但它本身并不是功能语言。
无论如何,这是我的非科学观点。
编辑:
回顾过去,考虑到到目前为止我已经收到的关于此答案的精美评论,我认为面向对象与功能的比较是苹果和橘子中的一种。
真正的区别在于执行上是否相互促进。功能语言将表达式作为其主要的语言结构,执行顺序通常是不确定的或者被定义为惰性的。可能执行严格,但仅在需要时使用。在指示性语言中,严格执行是默认设置,虽然可以执行懒惰执行,但这样做通常很繁琐,并且在许多情况下可能会产生无法预料的结果。
现在,这是我的非科学观点。
Ruby确实支持更高级别的功能(请参阅Array#map,inject和select),但它仍然是一种强制性的,面向对象的语言。
它避免了可变状态,是功能语言的主要特征之一。功能语言不像Ruby,C,Java或者任何其他命令式语言那样具有变量的概念。
函数式语言的另一个关键特性是,它着重于根据"什么"而不是"如何"来定义程序。当使用OO语言进行编程时,我们编写类和方法以从"什么"(类/方法名称)中隐藏实现("方式"),但是最后这些方法仍然使用一系列语句编写。在功能语言中,即使在最低级别,也不会指定执行顺序。
这取决于我们对功能语言的定义。就我个人而言,我认为该术语用作绝对值时本身就很成问题。成为功能性语言的更多方面,不仅仅是单纯的语言功能,而且还取决于我们所寻找的位置。例如,在这方面,围绕语言的文化非常重要。它鼓励功能性风格吗?那可用的库呢?它们是否鼓励我们以功能性方式使用它们?
例如,大多数人会将Scheme称为功能语言。但是,Common Lisp呢?除了多重/单个命名空间问题和保证的消除尾部调用(某些CL实现也支持此功能,具体取决于编译器设置)之外,没有什么使Scheme成为比Common更适合函数式编程的语言了。 Lisp仍然是大多数Lispers都不会将CL称为功能语言。为什么?因为其周围的文化在很大程度上取决于CL的命令性功能(例如,LOOP宏,大多数Schemers可能会不赞成这样做)。
另一方面,C程序员可能会认为CL是一种功能语言。毕竟,用Lisp方言编写的大多数代码在样式上肯定比我们通常的C代码块具有更多的功能。同样,与Haskell相比,Scheme是非常必要的语言。因此,我认为不可能有明确的是/否答案。是否调用语言功能很大程度上取决于观点。
请看看这本书的开头:" A-Great-Ruby-eBook"。它讨论了我们要问的非常具体的主题。我们可以在Ruby中进行不同类型的编程。如果我们想要像功能一样进行编程,则可以做到。如果我们想按势进行编程,则可以这样做。这是一个定义问题,到底Ruby的功能如何。请查看camflan用户的回复。
递归在函数式编程中很常见。几乎所有语言都支持递归,但是如果没有尾部调用优化(TCO),则递归算法通常无效。
函数式编程语言能够优化尾递归,并且可以在恒定空间中执行此类代码。有些Ruby实现确实优化了尾部递归,而其他的则没有,但是总的来说,不需要Ruby实现来进行TCO。请参见Ruby是否执行尾部调用优化?
因此,如果我们编写某种Ruby功能样式并依靠某些特定实现的TCO,则代码在另一个Ruby解释器中可能会非常无效。我认为这就是为什么Ruby不是功能语言(Python也不是)的原因。
语言是功能语言还是非功能语言都不重要。函数式编程是一个论文,最好由Philip Wadler(函数式编程的本质)和John Hughes(为什么函数式编程很重要)进行解释。
一个有意义的问题是," Ruby在实现函数式编程方面的表现如何?"答案是"非常糟糕"。
我刚刚在此发表了演讲。这是幻灯片。
严格来说,将一种语言描述为"功能性"是没有意义的。大多数语言都可以进行功能编程。甚至C ++也是如此。
功能样式或者多或者少是命令式语言功能的子集,由语法糖和一些编译器优化(如不变性和尾递归展平化)支持,
后者可以说是针对实现的次要技术,与实际语言无关。 x64 C4.0编译器执行尾递归优化,而x86则出于任何愚蠢的原因而没有。
语法糖通常可以在某种程度上得到解决,特别是如果该语言具有可编程的预编译器(即C的#define)。
问"语言__是否支持命令式编程?"可能会更有意义,例如,对于Lisp,答案是"否"。