私は次の機能を持っています:
def apply[A,B](fa: Option[A])(ff: Option[A => B]): Option[B] = (fa, ff) match {
case (None, _) => None
case (Some(_), None) => None
case (Some(a), Some(f)) => Some(f(a))
}
そしてそれはうまくコンパイルされます。
しかし、次のように関数を変更するとき:
def apply[A,B](fa: Option[A])(ff: Option[A => B]): Option[B] = (fa, ff) match {
case (None, _) => None
case (Some(_), None) => Some("Hello")
case (Some(a), Some(f)) => Some(f(a))
}
コンパイラは、関数が型に準拠していないと文句を言いOption[B]
ます。
apply 関数に渡してSome(1)
returnSome("Hello")
すると、別のタイプが返され、次に入力が返されます。私の意見では、入力タイプの次に別のタイプが返されます。
コンパイラは、値の型が準拠していないことOption[B]
をどのように認識し、最初の例にNone
準拠Option[B]
しているのはなぜですか?
1 番目 -None
すべてのOption[]
タイプに有効な値です。言い換えると...
val optx: Option[X] = None
... はどのタイプにも有効ですX
。
2番目 - コンパイラは何について知っていB
ますか? ff
そうでない場合はNone
、 type の出力が生成されB
ます。このapply()
メソッドの出力は、同じタイプである必要がありますが、 でB
ラップされている必要がありますOption
。
Some("Hello")
つまりOption[String]
、出力のみを生成するように制約Option[B]
されていることをコンパイラーに通知されていないため、準拠していません。ff
String
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加