4

私は何かが欠けていると思います:

scala> Some(1) collect ({ case n if n > 0 => n + 1; case _ => 0})
res0: Option[Int] = Some(2)

scala> None collect ({ case n if n > 0 => n + 1; case _ => 0})   
<console>:6: error: value > is not a member of Nothing
       None collect ({ case n if n > 0 => n + 1; case _ => 0})
                                 ^
<console>:6: error: value + is not a member of Nothing
       None collect ({ case n if n > 0 => n + 1; case _ => 0})

このエラーが発生するのはなぜですか?私はどのように機能するか誤解していると思いますcollect...

4

2 に答える 2

14

指定しない限り、リテラルNoneの型はOption[Nothing]です。None はすべての型 Option[_] の有効なメンバーである必要があるため、これが必要です。代わりに書いた場合

(None:Option[Int]) collect ({ case n if n > 0 => n + 1; case _ => 0}) 

また

val x:Option[Int] = None
x collect ({ case n if n > 0 => n + 1; case _ => 0}) 

その後、コンパイラは収集呼び出しをタイプチェックできます

于 2011-03-03T18:20:22.030 に答える
1
None collect ({ case n if n > 0 => n + 1; case _ => 0}) 

なぜnメソッドがあるの>ですか?コンパイラがそれを想定できるようにするものは何もありません。したがって、次のように変更してみてください。

None collect ({ case n: Int if n > 0 => n + 1; case _ => 0})

そして、次のエラー メッセージが表示されます。

<console>:8: error: pattern type is incompatible with expected type;
 found   : Int
 required: Nothing
       None collect ({ case n: Int if n > 0 => n + 1; case _ => 0}) 
                               ^

Intつまり、基本的には、渡すだけなので、ここではan が不可能であることをコンパイラが認識していることを意味しますNone。たまたま、NoneタイプはOption[Nothing]です。

于 2011-03-03T18:54:12.053 に答える