7

Scala プログラミング言語の勉強を始めています。Erlang や Haskell などの FP 言語についてはある程度理解していますが、次のような for/yield 式の意味について疑問があります。

for (arg <- args) yield arg.length

これにより、任意の入力引数の長さを含む配列が収集されます。私が理解したことから、これは通常の FP プログラミングの map 関数のようです。

map (\a -> a * 2) [1, 2, 3] (in Haskell)

Scala ライブラリには scala.collection.map メソッドが含まれていることを知っているので、知りたいのですが、どちらのスタイルを使用しても違いや制限はありますか、それともまったく同じですか?

4

3 に答える 3

15

for ... yieldScala の内包表記は、コンパイラによってmap,flatMapおよびwithFilterメソッド呼び出しに変換されます。forwithoutはメソッド呼び出しyieldに変換されます。foreachここでいくつかの例と詳細情報を見つけることができます:

http://tataryn.net/2011/10/whats-in-a-scala-for-comprehension/

そしてここ

http://adamwojtuniak.wordpress.com/2010/09/24/scala-for-comprehensions/

于 2012-04-16T22:03:00.563 に答える
6

Scala のfor/yield式は、Haskell のリスト/モナド内包表記と完全に同等であり、式ごとに 1 つの型に固執する限り、まったく同じ機能を備えていますfor。(ただし、Erlang についてはわかりません。)

特に、あなたの例は正確に に変換され[length arg | arg <- args]、Scala メソッド呼び出しx.fを Haskell 関数 application に変換しますf x

于 2012-04-16T21:56:35.133 に答える
3

for-yield はマップにコンパイルされます - これは Programming in Scala book にあります。

于 2012-04-16T22:02:00.017 に答える