- 1 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 22:40:17 ]
- The Scala Programming Language
ttp://www.scala-lang.org/ チュートリアル日本語訳 ttp://homepage.mac.com/takashi_miyamoto/scala/ScalaTutorial.pdf どう書く?org Scala ttp://ja.doukaku.org/lang/scala/
- 408 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 16:08:45 ]
- Existential Type周りの推論の仕組みは正直よくわかっていないので
確定的な事は言えないのですが、推論できていないというより、どうもバグな気がします たとえば、上記のコードを def getFunc(fun:Option[String => _ <: AnyRef]) = { fun match { case None => null case Some(f) => (i:String) => val a: AnyRef = f(i); a.notify() } } とすると、コンパイルが通ることから、少なくともf(i)の返り値が AnyRefのサブタイプであることは(コンパイラによって)認識されている ように見えます。色々試してみたところ、以下のようなコードの場合 val fun: Option[String => _ <: AnyRef] = Some((s: String) => s) val Some(f) = fun コンパイラが error: fatal error: bad type: ?(class scala.tools.nsc.symtab.Types$WildcardType$) というメッセージを吐いて落ちるようです。この辺の事から推測すると、 Existential Typeとパターンマッチを組み合わせたときのバグのような気がしますが、 本当のところはわからないので、本家ScalaのMLで聞いてみるのが良い気がします
- 409 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 16:10:42 ]
- 回避策ですが、Function Typeは、返り値についてcovariant
annotationが付加されているので、わざわざExistential Typeを使わずに、単純に def getFunc(fun:Option[String => AnyRef]) = { fun match { case None => null case Some(f) => (i:String) => f(i).notify() } } とすれば良いです。これで、ちゃんと getFunc(Some((s: String) => s)) などのコードをコンパイルできます
|

|