维基百科说Ruby是一种功能语言,但我不相信.为什么或者为什么不?
语言是否是函数式语言并不重要.功能编程是一篇论文,最好由Philip Wadler(功能编程的本质)和John Hughes(为什么功能编程事项)解释.
一个有意义的问题是,"Ruby如何能够实现函数式编程的论点?" 答案是"非常糟糕".
我刚才就此发表了演讲.这是幻灯片.
Ruby确实支持更高级别的函数(参见Array#map,inject和select),但它仍然是一种势在必行的面向对象语言.
功能语言的一个关键特征就是它避免了可变状态.函数式语言没有像Ruby,C,Java或任何其他命令式语言那样的变量概念.
功能语言的另一个关键特征是它侧重于用"什么"而不是"如何"来定义程序.当用OO语言编程时,我们编写类和方法来隐藏"what"(类/方法名称)中的实现("how"),但最后这些方法仍然使用一系列语句编写.在函数式语言中,即使在最低级别,也不指定执行顺序.
我绝对认为你可以在Ruby中使用功能风格.
能够以函数式编程的最关键方面之一是语言是否支持更高阶函数...... Ruby就是这样做的.
也就是说,在Ruby中以非功能性方式编程也很容易.功能样式的另一个关键方面是没有状态,并且具有对于给定输入集总是返回相同值的真实数学函数.这可以在Ruby中完成,但它并没有在像Haskell这样功能更严格的语言中强制执行.
所以,是的,它支持功能风格,但它也可以让你以非功能风格编程.
我认为支持,或者能够用功能风格的语言编程并不是一种功能语言.
我甚至可以编写Java代码在一个实用的风格,如果我想伤害我的同事和我自己数月的周.
拥有一种功能语言不仅仅是关于你能做什么,比如高阶函数,一流函数和currying.它也是关于你不能做的事情,比如纯函数中的副作用.
这很重要,因为它是函数式程序或者函数代码更容易推理的重要原因.当代码更易于推理时,错误会变得更浅,并浮动到可以修复它们的概念表面,从而减少错误代码.
Ruby本身就是面向对象的,所以即使它对功能风格有相当好的支持,它本身也不是一种功能语言.
无论如何,这是我的非科学意见.
编辑: 回想起来,考虑到我到目前为止收到的这个答案的精美评论,我认为面向对象与功能比较是苹果和橘子之一.
真正的区别在于是否在执行中具有比较性.函数式语言将表达式作为其主要语言结构,执行顺序通常未定义或定义为惰性.可以严格执行,但仅在需要时使用.在一种比较严格的语言中,严格执行是默认的,虽然延迟执行是可能的,但它往往很麻烦,并且在许多边缘情况下会产生不可预测的结果.
现在,这是我的非科学意见.
Ruby必须满足以下要求才能"正常"运行.
不可变值:一旦设置了"变量",就不能改变它.在Ruby中,这意味着您必须有效地处理变量,如常量.语言不完全支持,您必须手动冻结每个变量.
没有副作用:当传递给定值时,函数必须始终返回相同的结果.这与具有不可变的价值观密切相关; 函数永远不能获取值并更改它,因为这会导致与返回结果相关的副作用.
高阶函数:这些函数允许函数作为参数,或者使用函数作为返回值.可以说,这是任何功能语言最重要的特征之一.
Currying:由高阶函数启用,currying正在转换一个函数,该函数将多个参数转换为带有一个参数的函数.这与部分函数应用程序密切相关,部分函数应用程序将多参数函数转换为一个函数,该函数比原来的参数少.
递归:通过从内部调用函数来循环.当您无法访问可变数据时,递归用于构建和链数据构造.这是因为循环不是一个功能概念,因为它需要传递变量以在给定时间存储循环的状态.
延迟评估或延迟评估:延迟值的处理,直到实际需要它为止.例如,如果您有一些代码生成了启用了延迟评估的Fibonacci数字列表,那么实际上不会对其进行处理和计算,直到另一个函数(例如puts)需要结果中的某个值.
提案(只是一个想法)
我会很高兴有某种定义来mode
指示用函数范例声明文件,例如
模式'功能'
Ruby是一种多范式语言,支持函数式编程.