2017-02-01 16 views
-1

このエラーメッセージに関するご質問は非常にありますが、この問題に関するものはありません。Scalaの引数型オーバーロードでの匿名関数のタイプ

The argument types of an anonymous function must be fully known. (SLS 8.5) 

コードの問題のあるブロックは、引数がプロセスにマッチしたパターンとすることができる追加の利点と、Rubyのブロックの機能をエミュレートしようとしています。

object Block { 
    def apply(f: => Unit) = apply((_: String) => f) 
    def apply(f: String => Unit) = ??? 
} 
def example() = { 
    Block { // Error! 
    case "A" => println("First letter of the alphabet") 
    case _ => println("Not the first letter of the alphabet") 
    } 
} 

1つの行が表示されても、Scalaは文字列と一致していることがわかりますが、引数の型を推論することはできません。

答えて

1

ここでの問題は、2つの方法があることです。apply 1つしかない場合:

Scalaがアプリケーションを参照し、必要なタイプの無名関数をすぐに理解するので、すべてうまくいくはずです。しかし、2つの以上の異なる方法が存在する場合:

object Block { 
    def apply(f: => Bool) = apply((_: String) => f) 
    def apply(f: String => Bool) = ??? 
} 

Scalaはapplyのアプリケーションからの引数の型を推論することができない、それは引数の型から使用するapplyのどのアプリケーション推測することができないので、それはループに巻き込まれる。一番簡単な解決方法は、メソッドの名前を変更することです。

object Block { 
    def apply(f: => Unit) = apply((_: String) => f) 
    def branchOff(f: String => Unit) = ??? 
} 

今は電話するのがそれほど難しくありません。

Block { println("This is a regular application.") } 
Block.branchOff { 
    case "A" => println("A is for aardvark") 
    case "B" => println("B is for beaver") 
    case _ => println("Huh?") 
} 

また、型引数や明示的な引数を指定する必要はありません。

GitHubのスレッドオーバーでのこの詳細の詳細はhttps://github.com/ReactiveX/RxScala/issues/160です。

1

2つの異なるapply()メソッドがあるという考えが本当に好きな場合は、推論エンジンにいくつかの助けを提供する必要があります。

def example() = { 
    Block{s:String => s match { 
    case "A" => println("First letter of the alphabet") 
    case _ => println("Not the first letter of the alphabet") 
    }} 
}