Rubyは本当に関数型言語として使用できますか?言語のこの側面を教えるためのいくつかの良いチュートリアルは何ですか?注:私は本当にRubyを第一言語として使用し、それを使い続けたいので、現時点ではYAFL(さらに別の関数型言語)に変換することに興味はありません。私は、Rubyの関数型ファセットが標準の関数型言語ベースラインに対してどれだけうまく機能するかに本当に興味があります。ありがとう。
6 に答える
はい...ある種。Rubyには、不変性を強制するための合理的な構造がありません。(Object#freeze
カウントされません)不変性は実際には関数型言語の基礎です。さらに、Rubyのコアライブラリは、命令型の設計を重視しています。そのクラスArray
とHash
クラスはどちらも本質的に可変であり、String
不変にしないメソッドもあります(例gsub!
)。皮肉なことに、この点でJavaはRubyよりも「機能的」です。
そうは言っても、Rubyで機能的なプログラミングを行うことは可能です。block / proc / lambdaを使用するときはいつでも、関数型プログラミングに由来する機能を使用しています。同様に、map
およびのようなコレクションメソッドzip
も高階構造であり、Lisp、ML、Haskellなどの言語にルーツがあります。
関数型プログラミングを本当にやりたいのであれば、そのジャンルにもっと適した言語を使いたいと思うでしょう。いくつかの提案:
- Clojure -Rubyを使用して質問を表現したので、動的に型付けされた説得力があると思います。Clojureは、JVM上で実行される厳密に機能するLispのようなものです。
- F# -基本的にCLRのOCaml。とても素敵で、とてもきれい
- Scala-厳密には関数型言語ではありませんが、Rubyよりもはるかに優れています
- Haskell-みんなのお気に入り!
これら4つの言語のうち3つが静的に型付けされていることに気付くでしょう。実際、ScalaとHaskellの場合、これらは非常に静的に型付けされた言語です(たとえば、Javaよりもはるかに強力な型システム)。これが関数型言語のトレンドである理由はわかりませんが、それはあります。
「関数型プログラミング」の意味によって異なります。私の見解では、最も重要なことは、関数がファーストクラスの値であり、この点でRubyが関数型言語であるということです。
リスト内包表記のかなり包括的なセットがあります-MartinFowlerの記事を参照してください。ただし、その型システムはHaskellのようなものほど強力ではありません。また、関数型言語で一般的なように、その焦点は不変性にありません。
ほとんどの用途では、そうです。(多少制限はありますが)カリー化、第一級関数、および再帰を実行する機能があります。ただし、オブジェクトの作成とメソッドのディスパッチには高いコストがかかるため、深い再帰を使用すると、すぐに問題が発生する可能性があります。
Rubyは、さまざまなプログラミングの「型」に十分に適合しますが、ほとんどの場合、確かに最適ではありません。
また、何らかの再帰アルゴリズムを使用している場合は、すぐに問題が発生します。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
数千回の反復後 (システムによって異なります)
Haskellを見てください。これは、構文的にはRubyに非常に似ている関数型言語です。