2012-04-16 10 views
6

私はScalaプログラミング言語を学び始めています。 のように、私はアーランとHaskellのようなFP言語のいくつかの把握をしましたし、私はのために/歩留まり表現の意味について疑問を持っている:スカラの「yield」はmap関数と同等ですか?

for (arg <- args) yield arg.length 

これは、任意の入力引数の長さの配列を集めるでしょう。私はこれを理解してきたものから、 は、通常のFPプログラミングのマップ機能のように思える:

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

私はScalaのライブラリがscala.collection.mapメソッドが含まれていることを知っているので、私が知りたいのです:どんな違いがありますまたはいずれかのスタイルを使用する際の制限、またはまったく同じですか?

+1

[誰かがScalaの収量を説明できますか?](http://stackoverflow.com/questionsのが重複する可能性を/ 1052476/can-someone-explain-scalas-yield) –

+2

理解のためのScalaは、Haskellの 'do'表記に似ています。 –

+1

#ダニエルですが、私は「歩留まり」の意味は求めていませんが、他のFP式との類似点については質問しています! –

答えて

14

for ... yieldスカラでの理解は、コンパイラによってmapflatMapwithFilterメソッド呼び出しに変換されます。 yieldなしのforは、foreachメソッド呼び出しに変換されます。あなたはここにいくつかの例やより多くの情報を見つけることができます。

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

、ここ

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

+4

そして、flatMapとwithFilterは、concatとselectと同等です...実際には、この機能パターンの標準命名システムを定義する必要があります;) –

6

Scalaのfor/yield式はHaskellではリスト/モナド内包表記と完全に同等であり、そして限り、あなたはfor表現ごとに1種類に固執すると、まったく同じ機能を持っています。 (でも、私は、Erlangのことは知らない。)特に

、あなたの例では正確に[length arg | arg <- args]に変換、Haskellの関数適用f xにScalaのメソッド呼び出しx.fを翻訳します。

+1

'yield'はインクリメンタル出力を生成するのでしょうか?あるいは、リスト全体が1つになりますか? –

+1

良い例Ptharien、Haskellは常に前倒しです!歩留まりの増分出力については、コードを並列化したいときには、Scalaが並列コレクションと.parメソッドを持っていることを覚えていればそれが重要だと思います。 –

3

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

関連する問題