2012-02-24 29 views
6

この質問に答えようとしているとき:Leave off underscore in function literal例をコード化しようとしましたが、私は奇妙な動作に直面しました。Scala::::

scala> val myList = 1::2::Nil 
myList: List[Int] = List(1, 2) 

scala> def concat:(List[Int]=> List[Int]) = myList::: 
concat: (List[Int]) => List[Int] 

scala> concat(3::Nil) 
res1: List[Int] = List(3, 1, 2) 

私は_またはx=> f(x)構文を使用するとき、私は良い答えを持っていますが。

scala> def concat0:(List[Int]=> List[Int]) = x=> myList:::x 
concat0: (List[Int]) => List[Int] 

scala> def concat1:(List[Int]=> List[Int]) = myList::: _ 
concat1: (List[Int]) => List[Int] 

scala> concat0(3::Nil) 
res2: List[Int] = List(1, 2, 3) 

scala> concat1(3::Nil) 
res3: List[Int] = List(1, 2, 3) 

myListが機能concat3::Nil後に来る理由を合理的な説明はありますか?

答えて

7

myList ::: _は、_.:::(myList)に変換され、myList :::は、myList.:::(_)となります。

TL; DR

This postは右結合方法について詳細に入ります。何ここで起こっては次のとおりです。

  • def concat0:(List[Int]=> List[Int]) = x=> myList:::x
    • Scalaのコンパイラであれば種類List[Int]
    • ListのXを推測することができますので、右結合性のルールの:::方法
    • を持っている、これはx.:::(myList)に変身これは、myListxの先頭に付けます。
  • デフ連結:(一覧[INT] =>一覧[INT])=はmyList :::
    • myListタイプの場合List[Int]
    • :::のない右側はありませんが、そうあります右結合性なし
    • 代わりに、コンパイラは以下を推論します。 myList:::
    • myList.:::myListxを付加した、x => myList.:::(x)と同じです。
+0

本当に詳細で明確な投稿をありがとう。 –