2014-01-07 10 views

答えて

4

次のことを考えてみましょう:

def list1 = { println("1st list!"); List(1, 2, 3) } 
def list2 = { println("2nd list!"); List(4, 5) } 
def empty = { println("Empty string!"); "" } 

そして:ここ

scala> val foo = (list1 ++ list2).foldLeft(empty) _ 
Empty string! 
1st list! 
2nd list! 
foo: ((String, Int) => String) => String = <function1> 

(list1 ++ list2).foldLeft(empty)は、メソッドの型の式で、list1 ++ list2emptyは文字通りそのあるその最大のサブ式で、あります最大の構成式。我々は、強制的にエタ拡張を行うのに、必要ではない場合もあるが、_を使用している。

それは、我々は例えば機能fooを、使用するたびに評価されるlist1 ++ list2をたくない理にかなって、それは§6.26.5で説明した変換が実現-それがどのようなサブ式であることを確認します関数が作成される前に一度評価され、保存されます。

我々は-printでREPLを開始したい場合、我々は(わかりやすくするために再フォーマット)、以下を見ていると思います:

$read$$iw$$iw.this.foo = { 
    <synthetic> val eta$0$1: String = $line5.$read$$iw$$iw.empty(); 
    <synthetic> val eta$1$1: List = $line3.$read$$iw$$iw.list1().++(
    $line4.$read$$iw$$iw.list2(), 
    immutable.this.List.canBuildFrom() 
).$asInstanceOf[List](); 
    { 
    (new anonymous class anonfun$1(eta$0$1, eta$1$1): Function1) 
    } 
}; 

あなたは正確に与えられたサブ式を構成するもの迷っている場合これは簡単なチェック方法です。<synthetic> valで始まる行を探します。

+0

"であり、これはちょうど文字通りその最大の構成表現である。まだ少し漠然としていると思います。純粋なFPがあればfoldLeft(list1 ++ list2)(空)_に対応するので、++(list1、list2)は2つの小さな部分式に応じて最大の式です(list1とlist2)リスト2)? – Felix

+0

また、これは最も多くの場合、単純に引数式全体であると言うのは完全にオフですか? – Felix

+1

値の型(およびこの種の変換を値として使用する必要があるメソッド型の式)として存在しない「メソッド型」の考え方は、最初は純粋なFPからかなり離れています。純粋なFPの例では、 'foldLeft'はすでに関数であり、この種の変換の必要はありません。一般に、最大部分式は、メソッドが他のパラメータリストの引数と一緒に呼び出される式になります。 –

関連する問題