2016-11-17 17 views
1

関数を呼び出す方法を理解するために時々苦労します。誰かが私を助けてくれますか?スカラAPIの関数のシグネチャを理解できません

私はリストを研究しており、そのメソッドのサンプル例を書いています。私はandThenに関数リテラルを渡す必要があることを理解

def andThen[C](k: (A) ⇒ C): PartialFunction[Int, C] 

を次のように

andThen

が定義されています。だから私は動作する次のコードを作成しました。

scala> val l = List (1,2,3,4) 
l: List[Int] = List(1, 2, 3, 4) 

//x:Int works 
scala> val listAndThenExample = l.andThen((x:Int) => (x*2)) 
listAndThenExample: PartialFunction[Int,Int] = <function1> 

//underscore works 
scala> val listAndThenExample = l.andThen(_*2) 
listAndThenExample: PartialFunction[Int,Int] = <function1> 

リストが整数であるため、AはIntでなければなりません。 Cは関数リテラルの出力に依存して何でもかまいません。

上記は意味があります。

その後、私はapplyOrElseを試しました。以上のことから

def applyOrElse[A1 <: Int, B1 >: A](x: A1, default: (A1) ⇒ B1): B1 

を次のようにその署名があり、私はA1がintまたはそのサブクラス(は、UpperBound)することができ、いくつかのB1は、(私はデフォルトの機能で何をすべきかに依存する)戻り値の型になることを理解しています。

私のA1とB1の理解が正しい場合、xはIntまたはそのサブクラスになり、デフォルトの関数リテラルはInt(またはサブクラス)をとり、B1を返します。次のように関数を呼び出そうとしましたが、y:Intを使用すると機能しませんが、を使用すると機能します。私はなぜ

scala> val l = List (1,2,3,4) 
l: List[Int] = List(1, 2, 3, 4) 

//this doesnt work 
cala> val listApplyOrElse = l.applyOrElse(y:Int,(x:Int)=>println("Wrong arg "+x)) 
<console>:12: error: not found: value y 
     val listApplyOrElse = l.applyOrElse(y:Int,(x:Int)=>println("Wrong arg "+x)) 
             ^
//but underscor works 
scala> val listApplyOrElse = l.applyOrElse(_:Int,(x:Int)=>println("Wrong arg "+x)) 
listApplyOrElse: Int => AnyVal = <function1> 

質問を理解していない - なぜ両方のx:INTと_:intはandThenのためではなく、applyOrElseのために働いていましたか? 質問 - 「A」とは何ですか、B1はAに関連するのですか?

+0

'l.applyOrElse(_:Int、(x:Int)=> println(" Wrong arg "+ x))'(y:Int)=> l.applyOrElse(y、 :Int)=> println( "間違ったarg" + x)) ' –

答えて

1

ドキュメントによれば、applyOrElse(x, default)はあなたの部分関数が値のインデックスから関数、すなわちリスト(0〜3)(1,2,3,4)であり、この場合

if (pf isDefinedAt x) pf(x) else default(x) 

と等価です。あなたが言っている

l.applyOrElse(y,(x:Int)=>println("Wrong arg "+x)) 

を行うときに、「それは理にかなっている場合、それ以外println("Wrong arg"+y)l(y)を呼び出します」。コンパイラは「yとは何ですか?「

あなたは完全に別の何かが、あなたが部分的に適用機能取得んアンダースコアを使用して

l.applyOrElse(3 ,(x:Int)=>println("Wrong arg "+x)) // returns 4 
l.applyOrElse(8 ,(x:Int)=>println("Wrong arg "+x)) // prints Wrong arg 8 

期待どおりに動作する実際の値を使用する場合(一部機能は全く異なる!)

val f = l.applyOrElse(_:Int, (x:Int)=>println("Wrong arg "+x)) 
f(8) // prints Wrong arg 8 
0

yを宣言していないため、使用しようとするとエラーになります。 _:Intは、これが部分的に適用された関数を作成しているために機能します。戻り値の型は値ではなく、関数であることに注意してください。この返された関数は、2番目の引数が既に提供されている(最初のものではない)applyOrElseです。

andThenの例では、_の使用は別のことを意味します。具体的には、関数リテラルの略記です。

関連する問題