2016-05-10 7 views
6

私は現時点でlambdaという種類のコードを扱っており、IntelliJは「高度な言語機能:反射呼び出し」と警告していることに気づきました。反射呼のScala型ラムダコストはかかりますか?

サンプルコード:

implicit def monoidApplicative[M](M: Monoid[M]) = 
    new Applicative[({ type f[x] = Const[M, x] })#f] { 
    def unit[A](a: => A): M = M.zero 
    override def apply[A,B](m1: M)(m2: M): M = M.op(m1, m2) 
    } 

注:私はそれが型ラムダは、コンパイル時に解決されるという意味になるだろうと、これはIntelliJのScalaのプラグインのバグかもしれないことを把握。

+2

あなたの質問に対する答えはわかりませんが、あなたのコードにたくさんのタイプのlambdaがあると言うなら、https://github.com/non/kind-projector –

+0

をチェックアウトすることをお勧めします。 IJのScalaプラグインがそれをサポートしているかどうか? –

+1

私はまだそれを使っていませんでしたが、これに基づいて:http://blog.jetbrains.com/scala/2015/07/31/inline-refactoring-for-type-aliases-and-kind-projector-support/それはかなりの時間からサポートされるべきです。 –

答えて

8

IDEAは、ブロック{ }のためにちょうど混乱します。実行時にこのコードは存在しません。

ここに小さな例があります。 1型引数を持つタイプのための汎用的なアイデンティティ方法:

class Test[A, B] 
id(new Test[Int, Int]) 

<console>:10: error: type mismatch; 
found : Test[Int,Int] 
required: F[A] 
       id(new Test[Int, Int]) 

しかし、私たちがするタイプのラムダを使用することができます。2型の引数を取るタイプでこのメソッドを呼び出すことはできません

def id[F[_], A](value: F[A]) = value 

id:

def id2[F[_, _], A, B](value: F[A, B]) = 
    id[({ type f[x] = F[A, x] })#f, B](value) 

id2(new Test[Int, Int]) 
res3: Test[Int,Int] = [email protected] 

idの意味で実装されている関数id2を定義します。バイトコードを見てみましょう。

scala> :javap -c id2 

... 

    public <F, A, B> F id2(F); 
Code: 
    0: getstatic  #19     // Field .MODULE$:L; 
    3: aload_1 
    4: invokevirtual #22     // Method .id:(Ljava/lang/Object;)Ljava/lang/Object; 
    7: areturn 

... 

ご覧のとおり、種類の細かい点は何も残っていません。反射はない、何もない。ちょうどjava.lang.Object

関連する問題