8

def と同等の関数を val として宣言しましょう。

scala> def optional(x:Int):Option[String] = None
optional: (x: Int)Option[String]

scala> val optional2:(Int)=>Option[String] = (i:Int) => None
optional2: Int => Option[String] = <function1>

なぜこれがうまくいかないのでしょうか?

scala> List(1).flatMap(optional2)
<console>:9: error: type mismatch;
 found   : Int => Option[String]
 required: Int => scala.collection.GenTraversableOnce[?]
              List(1).flatMap(optional2)
                              ^

これらの両方が行う間?

scala> List(1).flatMap(optional)
res4: List[String] = List()

scala> List(1).flatMap(optional2(_))
res5: List[String] = List()

Option は GenTraversableOnce のサブタイプではないため、これは Implicit と関係があるに違いないと思いますが、それが正確に何であるかはわかりません。Scala 2.9.1 を使用しています。

4

1 に答える 1

7

暗黙の変換Option.option2Iterableは、機能するものList(1).flatMap(optional)ですList(1).flatMap(optional2(_))

あなたの問題は、ピックアップされていない暗黙の変換に要約できます。

scala> val optional2:(Int)=>Option[String] = (i:Int) => None
optional2: Int => Option[String] = <function1>

scala> (optional2(_)): Function[Int, Iterable[String]]
res0: Int => Iterable[String] = <function1>

scala> (optional2): Function[Int, Iterable[String]]
<console>:9: error: type mismatch;
 found   : Int => Option[String]
 required: Int => Iterable[String]

アンダースコアを使用すると、コンパイラは関数を型指定し、必要な暗黙的な変換を提供しようとします。optional2 を指定するだけでは、適用される暗黙の変換はありません。

于 2012-03-18T18:56:58.237 に答える