2017-10-16 18 views
1

2つの型パラメータを持つ関数を指定すると、1つの型に対して型パラメータを渡すことが可能ですか?たとえば、型としてA型を渡します。B関数からコンパイラによって推論できます。 fスカラーのパラメータ型推論

def foo[A, B](f: A => B): B = { 
    f(null.asInstanceOf[A]) 
} 

今は2つの解決策しか見つかりませんでした。

溶液1(標準的な使用は):fooを呼び出し、両方のタイプを指定foo[String, Int](e => 1)しかしIntの定義は

溶液2冗長である:

def foo[A, B](useType: A => Unit)(f: A => B): B = { 
    f(null.asInstanceOf[A]) 
} 

に関数の定義を変更し、それを使用

def use[T](t: T) = {} 

val res: Int = foo(use[String]) { a => 1 } 

これは機能しますが、それは機能しません型をコンパイラに渡します。

Aと入力すると、2つのタイプのパラメータを持つ関数にはちょうどタイプ指定できますか?

答えて

1

一般に、型パラメータはScalaでは部分的には適用できません。方法でもクラスでも。いくつかのラッパーを使用することができます。

いくつかのパス依存型でたぶん
def myMethod[A, B]() = ??? 

    def myMethod1[A0, W <: Wrapper { type A = A0 }]() = ??? 

    trait Wrapper { 
    type A 
    type B 
    } 

def myMethod1[A0, W <: Wrapper { type A = A0 }](w: W)(): w.B = ??? 

そしてない方法が、クラスの場合には型ラムダとタイプのメンバーとのアプローチがあります(タイプメンバーが可能部分的に適用される:trait Wrapper { type A; type B }Wrapper { type A = A0 }Wrapper[A0, _]trait Wrapper[A, B]のような実在のタイプです。

Partially applying type parameters

+0

あなたの答えのおかげで、私はこの方向に深く見て、私は関数の代わりにクラスを使用することができるかどうかを確認します。 –