维基百科称Ruby是一种函数式语言,但我并不信服。你认为呢?
维基百科称Ruby是一种函数式语言,但我并不信服。你认为呢?
语言是否是函数式语言并不重要。函数式编程是一个论题,由Philip Wadler(函数式编程的本质)和John Hughes(为什么函数式编程很重要)最好地解释。
一个有意义的问题是,“Ruby对实现函数式编程的论题有多容易?” 答案是“非常困难”。
我最近就这个问题发表了演讲。这是幻灯片。
Ruby支持更高级别的函数(参见Array#map,inject和select),但它仍然是一种命令式的面向对象语言。
函数式语言的一个关键特征是避免可变状态。函数式语言没有像Ruby、C、Java或其他命令式语言中那样的变量概念。
函数式语言的另一个关键特征是将程序定义为“什么”,而不是“如何”。在面向对象的语言中编程时,我们编写类和方法来隐藏实现(“如何”)对于“什么”(类/方法名称)的细节,但最终这些方法仍然是使用语句序列编写的。在函数式语言中,您不需要指定执行顺序,即使在最低级别也是如此。
我认为在Ruby中可以使用函数式编程风格。
要能够以函数式编程的方式编程,最关键的一点是语言是否支持高阶函数...而Ruby确实支持此功能。
话虽如此,在Ruby中也很容易以非函数式编程风格进行编程。函数式编程的另一个关键方面是不具有状态,并且拥有真正的数学函数,这些函数始终对于给定的一组输入返回相同的值。这在Ruby中也可以做到,但它并不能像Haskell等更严格的函数式语言那样强制执行。
因此,是的,Ruby支持函数式编程风格,但也允许您使用非函数式编程风格进行编程。
我认为,支持或具有使用函数式 风格 编程的能力并不代表这是一个函数式语言。
如果我想要折磨我的同事和自己几个 月 星期,我甚至可以用函数式风格编写Java代码。
拥有函数式语言不仅仅在于你 可以 做什么,例如高阶函数、一级函数和柯里化。它也关乎于你 不能 做什么,例如在纯函数中引入副作用。
这一点很重要,因为它是功能性程序易于理解的一个重要原因。当代码易于理解时,错误变得更加显而易见,并且浮现出来,这样就可以进行修复,从而产生更少的错误代码。
Ruby 本质上是面向对象的,因此即使它对函数式风格有相当良好的支持,它本身也不是一个函数式语言。
这是我非科学的观点。
编辑: 回顾并考虑到我迄今收到的精美评论,我认为面向对象与函数式比较有点类似苹果和橙子之间的区别。
真正的区别在于是否以命令式方式执行。函数式语言将表达式作为其主要的语言构造,执行顺序通常是未定义的或定义为惰性。严格执行是可能的,但只有在需要时才使用。在命令式语言中,严格执行是默认值,虽然惰性执行是可能的,但在许多边缘情况下,这通常很糟糕并且可能具有不可预测的结果。
现在,这是 我非科学的观点。
mode
指令定义为声明具有函数式编程范式的文件,例如:
mode 'functional'
Ruby是一种支持函数式编程风格的多范式语言。
严格来说,将一种语言描述为“函数式”并没有什么意义;大多数语言都能够进行函数式编程,甚至包括C++。
函数式风格实际上是命令式语言特性的一个子集,使用了一些语法糖和编译器优化,比如不可变性和尾递归展开。
后者可能是一个次要的、与实际语言无关的技术细节。例如,x64 C# 4.0编译器进行了尾递归优化,而x86编译器由于某些愚蠢的原因则没有进行优化。
通常可以通过一些方式规避语法糖,特别是如果该语言具有可编程的预编译器(如C的#define)。
或许更有意义的问题是,“语言X是否支持命令式编程?”例如,对于Lisp来说,答案是否定的。