Ruby真的可以用作函数式语言吗?

时间:2008-10-17 18:31:47

标签: ruby functional-programming

Ruby真的可以用作函数式语言吗?教这个语言方面有哪些好的教程?注意:我真的想使用并坚持使用Ruby作为我的主要语言,因此我对此转换为YAFL(另一种函数式语言)并不感兴趣。我真的很感兴趣Ruby的功能方面对标准功能语言基线的表现如何。感谢。

6 个答案:

答案 0 :(得分:12)

是的......有点儿。 Ruby缺乏合理的构造来强制实现不变性。 (Object#freeze不计算)不变性实际上是函数式语言的基石。此外,Ruby的核心库非常注重命令式设计。它的ArrayHash类本质上都是可变的,即使String具有非永久性的方法(例如gsub!)。具有讽刺意味的是,Java在这方面比Ruby更具“功能性”。

据说,可以在Ruby中进行类似函数式的编程。无论何时使用块/ proc / lambda,您都使用来自函数式编程的功能。同样,像mapzip这样的集合方法也是高阶构造,它们的根源是Lisp,ML和Haskell等语言。

如果您真的想要进行函数式编程,那么您将需要使用更适合该类型的语言。一些建议:

  • Clojure - 自从你用Ruby表达了这个问题,我猜你是动态类型的说服力。 Clojure就像一个在JVM上运行的严格功能的Lisp。
  • F# - 基本上是CLR上的OCaml。非常好,非常干净
  • Scala - 不是严格函数式语言,但比Ruby好得多
  • 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非常相似。