5

種類の多いタイプにバインドされたビューを設定しようとしていますが、理解できないエラーメッセージが表示されます。

$ scala -language:higherKinds
Welcome to Scala version 2.10.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_43).
Type in expressions to have them evaluated.
Type :help for more information.

scala> trait F[M[_]]
defined trait F

scala> def foo[M[_]](implicit m: M[_] => F[M]) = 42
foo: [M[_]](implicit m: M[_] => F[M])Int

scala> def bar[M[_] <% F[M]] = 42
<console>:8: error: type M takes type parameters
       def bar[M[_] <% F[M]] = 42
                    ^

barと同じものにコンパイルするべきではありませんfooか?私は何が欠けていますか?

4

1 に答える 1

6

M[_]型パラメーター リスト内の と型M[_](つまり、M[_]暗黙パラメーター リスト内の関数型で が果たす役割) の間には微妙な違いがあることに注意してください。1 つ目は型コンストラクターのパラメーターで、2 つ目は存在型です(詳細については、 Scala 言語仕様のセクション 4.4 および 3.2.10 を参照してください)。

したがって、たとえば、意味を変更せずに型コンストラクターのパラメーターM[_]をに置き換えることができM[X]ますが、後者の場合は構文エラーになります (これは のようなものの代わりに省略形ですM[X] forSome { type X })。

次の例では、違いがより明確になる場合があります (問題なくコンパイルされます)。

scala> def bar[M[_], M_ <: M[_] <% F[M]] = 42
bar: [M[_], M_ <: M[_]](implicit evidence$1: M_ => F[M])Int

ここで、1 つ目M[_]は型コンストラクターのパラメーターであり、2 つ目 ( の上限M_) は存在型です。

Scala コンパイラーはM[_] <% F[M]、ここで期待どおりに機能する可能性があります。つまり、型コンストラクターのパラメーターを、コンテキスト バインド用に作成する暗黙的なパラメーターの型の存在型に変換できますが、それには余分な小さな部分が必要になります。コンパイラの魔法の、そしてそれはすでに十分にあります。

于 2013-03-17T13:43:52.150 に答える