Ruby真的可以用作函数式语言吗?教这个语言方面有哪些好的教程?注意:我真的想使用并坚持使用Ruby作为我的主要语言,因此我对此转换为YAFL(另一种函数式语言)并不感兴趣。我真的很感兴趣Ruby的功能方面对标准功能语言基线的表现如何。感谢。
答案 0 :(得分:12)
是的......有点儿。 Ruby缺乏合理的构造来强制实现不变性。 (Object#freeze
不计算)不变性实际上是函数式语言的基石。此外,Ruby的核心库非常注重命令式设计。它的Array
和Hash
类本质上都是可变的,即使String
具有非永久性的方法(例如gsub!
)。具有讽刺意味的是,Java在这方面比Ruby更具“功能性”。
据说,可以在Ruby中进行类似函数式的编程。无论何时使用块/ proc / lambda,您都使用来自函数式编程的功能。同样,像map
和zip
这样的集合方法也是高阶构造,它们的根源是Lisp,ML和Haskell等语言。
如果您真的想要进行函数式编程,那么您将需要使用更适合该类型的语言。一些建议:
您会注意到这四种语言中有三种是静态类型的。实际上,在Scala和Haskell的情况下,这些是非常静态类型语言(比Java更强大的类型系统)。我不确定为什么这是函数式语言的趋势,但你有它。
答案 1 :(得分:4)
这取决于“功能编程”的含义。在我看来,最重要的是函数是first class values,在这方面,Ruby是一种函数式语言。
答案 2 :(得分:2)
它有一套相当全面的列表推导 - 见Martin Fowler's article。但是,它的类型系统并不像Haskell那样强大。此外,它的重点不在于不变性,这是函数式语言的典型特征。
答案 3 :(得分:0)
对于大多数用途,是的。有(虽然有点限制)做currying,一等函数和递归的能力。但由于对象创建和方法调度的高成本,深度递归会让您快速陷入困境!
Ruby非常适合各种编程“模具”,但它在大多数情况下肯定不是最佳的。
答案 4 :(得分:0)
如果你使用任何类型的递归算法,你也会很快遇到问题。 Ruby不支持尾递归,所以如果你不能可靠地使用递归作为迭代技术,就像你在更多功能语言中做事的自然方式一样。类似的东西:
def foo(n)
puts n
foo(n + 1)
end
foo(1)
会给你
SystemStackError: stack level too deep
from (irb):2:in `puts'
from (irb):2:in `foo'
from (irb):3:in `foo'
from (irb):5
经过几千次迭代(取决于您的系统)
答案 5 :(得分:-4)
看看Haskell。它是一种函数式语言,在语法上与Ruby非常相似。