当前位置:  开发笔记 > 编程语言 > 正文

Ruby是一种功能语言吗?

如何解决《Ruby是一种功能语言吗?》经验,为你挑选了6个好方法。

维基百科说Ruby是一种功能语言,但我不相信.为什么或者为什么不?



1> Tony Morris..:

语言是否是函数式语言并不重要.功能编程是一篇论文,最好由Philip Wadler(功能编程的本质)和John Hughes(为什么功能编程事项)解释.

一个有意义的问题是,"Ruby如何能够实现函数式编程的论点?" 答案是"非常糟糕".

我刚才就此发表了演讲.这是幻灯片.


没有幻灯片没有详细介绍,因为这是一个非常广泛的主题.例如,存在过度简化的风险,Ruby强制执行评估模型(按值调用),以确保程序的非组合性.这种影响很容易被低估.Ruby也认为程序是一系列效果.也就是说,Ruby不遗余力地使用任何其他计算模型变得困难/难以控制.我希望这篇简短的评论有所帮助
你给出的幻灯片没有提到_why_ Ruby"很难实现FP的论点." 为什么C#比Java更适合(好的,更简单的匿名函数?)?是因为你可以在Ruby中拥有全局变量吗?
+1用于指出将语言分类为功能的歧义.天啊,我写过功能性的C!

2> Mike..:

Ruby确实支持更高级别的函数(参见Array#map,inject和select),但它仍然是一种势在必行的面向对象语言.

功能语言的一个关键特征就是它避免了可变状态.函数式语言没有像Ruby,C,Java或任何其他命令式语言那样的变量概念.

功能语言的另一个关键特征是它侧重于用"什么"而不是"如何"来定义程序.当用OO语言编程时,我们编写类和方法来隐藏"what"(类/方法名称)中的实现("how"),但最后这些方法仍然使用一系列语句编写.在函数式语言中,即使在最低级别,也不指定执行顺序.


根据定义,HHC是一个可以*改变*的值.你所说的是价值观.
我同意你的大部分陈述,但是,我不同意"功能语言没有你在Java等中所拥有的变量概念".在haskell中,你可以在纯函数中使用变量,你甚至可以为一个变量赋一个函数,最大的区别是一旦赋值变量就不能在之后进行修改.

3> Mike Stone..:

我绝对认为你可以在Ruby中使用功能风格.

能够以函数式编程的最关键方面之一是语言是否支持更高阶函数...... Ruby就是这样做的.

也就是说,在Ruby中以非功能性方式编程也很容易.功能样式的另一个关键方面是没有状态,并且具有对于给定输入集总是返回相同值的真实数学函数.这可以在Ruby中完成,但它并没有在像Haskell这样功能更严格的语言中强制执行.

所以,是的,它支持功能风格,但它也可以让你以非功能风格编程.


使用这个标准,你会说Smalltalk是否有功能,因为它有块?
只是,想说@peter问'红宝石是一种功能语言吗?`并且直接回答是一个简单的问题.Ruby是一种面向对象的语言,具有一些功能特性.

4> Chris Vest..:

我认为支持,或者能够用功能风格的语言编程并不是一种功能语言.

我甚至可以编写Java代码在一个实用的风格,如果我想伤害我的同事和我自己数的周.

拥有一种功能语言不仅仅是关于你能做什么,比如高阶函数,一流函数和currying.它也是关于你不能做的事情,比如纯函数中的副作用.

这很重要,因为它是函数式程序或者函数代码更容易推理的重要原因.当代码更易于推理时,错误会变得更浅,并浮动到可以修复它们的概念表面,从而减少错误代码.

Ruby本身就是面向对象的,所以即使它对功能风格有相当好的支持,它本身也不是一种功能语言.

无论如何,这是我的非科学意见.

编辑: 回想起来,考虑到我到目前为止收到的这个答案的精美评论,我认为面向对象与功能比较是苹果和橘子之一.

真正的区别在于是否在执行中具有比较性.函数式语言将表达式作为其主要语言结构,执行顺序通常未定义或定义为惰性.可以严格执行,但仅在需要时使用.在一种比较严格的语言中,严格执行是默认的,虽然延迟执行是可能的,但它往往很麻烦,并且在许多边缘情况下会产生不可预测的结果.

现在,这是我的非科学意见.


许多人认为Lisp和Scheme函数语言很大程度上是由于匿名函数的普遍使用.然而,他们缺乏保证纯粹的功能.将术语限制为支持纯函数的语言似乎过于严格.

5> Elias Perez..:

Ruby必须满足以下要求才能"正常"运行.

不可变值:一旦设置了"变量",就不能改变它.在Ruby中,这意味着您必须有效地处理变量,如常量.语言不完全支持,您必须手动冻结每个变量.

没有副作用:当传递给定值时,函数必须始终返回相同的结果.这与具有不可变的价值观密切相关; 函数永远不能获取值并更改它,因为这会导致与返回结果相关的副作用.

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

Currying:由高阶函数启用,currying正在转换一个函数,该函数将多个参数转换为带有一个参数的函数.这与部分函数应用程序密切相关,部分函数应用程序将多参数函数转换为一个函数,该函数比原来的参数少.

递归:通过从内部调用函数来循环.当您无法访问可变数据时,递归用于构建和链数据构造.这是因为循环不是一个功能概念,因为它需要传递变量以在给定时间存储循环的状态.

延迟评估或延迟评估:延迟值的处理,直到实际需要它为止.例如,如果您有一些代码生成了启用了延迟评估的Fibonacci数字列表,那么实际上不会对其进行处理和计算,直到另一个函数(例如puts)需要结果中的某个值.

提案(只是一个想法) 我会很高兴有某种定义来mode指示用函数范例声明文件,例如

模式'功能'


别客气.我想邀请您阅读有关函数式语言的内容.Lisp是所有功能性语言,ML(CAML)和Erlang/Elixir的祖父母.它真的改变了你对事物的看法.我不是专家,但是不断学习计算机科学的学生喜欢阅读和学习新东西.

6> skymt..:

Ruby是一种多范式语言,支持函数式编程.


提供证据
推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有