10

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

4

6 回答 6

12

是的……有点。Ruby 缺乏一个合理的构造来强制执行不变性。(Object#freeze不算)不变性确实是函数式语言的基石。此外,Ruby 的核心库高度面向命令式设计。它ArrayHash类本质上都是可变的,甚至String具有使不可变的方法(例如gsub!)。具有讽刺意味的是,Java 在这方面比 Ruby 更“实用”。

话虽如此,可以在 Ruby 中进行类似函数式的编程。任何时候你使用 block/proc/lambda,你都在使用来自函数式编程的特性。同样,收集方法和类似mapzip也是高阶结构,它们起源于 Lisp、ML 和 Haskell 等语言。

如果你真的想做函数式编程,你会想要使用更适合该类型的语言。一些建议:

  • Clojure - 既然你用 Ruby 来表达这个问题,我猜你是动态类型的说服力。Clojure 就像一个在 JVM 上运行的严格功能的 Lisp。
  • F# - 基本上是 CLR 上的 OCaml。很好很干净
  • Scala - 不是一种严格的函数式语言,但比 Ruby 更好
  • Haskell - 每个人的最爱!

您会注意到这四种语言中的三种是静态类型的。事实上,就 Scala 和 Haskell 而言,它们是非常静态类型的语言(比 Java 更强大的类型系统)。我不确定为什么这是函数式语言的趋势,但是你有它。

于 2008-10-17T18:39:50.280 回答
4

这取决于您所说的“函数式编程”是什么意思。在我看来,最重要的是函数是一等值,在这方面 Ruby 是一门函数式语言。

于 2008-10-17T18:37:59.470 回答
2

它有一套相当全面的列表推导 - 请参阅Martin Fowler 的文章。但是,它的类型系统不如 Haskell 之类的强大。此外,它的重点不在于不变性,这是函数式语言的典型特征。

于 2008-10-17T18:40:49.527 回答
0

对于大多数用途,是的。有(尽管有点有限)进行柯里化、一等函数和递归的能力。但是由于对象创建和方法分派的高成本,深度递归会让你很快陷入困境!

Ruby 有足够的能力融入各种编程“模型”,但它在大多数情况下肯定不是最佳的。

于 2008-10-17T18:41:21.757 回答
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

经过几千次迭代(取决于您的系统)

于 2008-10-18T01:12:20.847 回答
-4

看看Haskell。它是一种在语法上与 Ruby 非常相似的函数式语言。

于 2008-10-17T18:51:47.290 回答