2017-10-16 3 views
1

두 개의 유형 매개 변수가있는 함수가있는 경우 단일 유형에 대한 유형 매개 변수를 스칼라로 전달할 수 있습니다. 예를 들어 유형이 A 인 경우에는 B을 함수에서 컴파일러가 유추 할 수 있습니다. f.스칼라에서 매개 변수 유형 추론

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

바로 지금 나는 두 가지 해결책을 발견했습니다.

해결 방법 1 (표준 사용량) : foo에 전화 두 가지 유형을 지정 foo[String, Int](e => 1)하지만 Int의 정의는

솔루션이 중복 :

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 만 입력하면됩니다.

답변

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 }trait Wrapper[A, B]의 경우 Wrapper[A0, _]과 같은 실존 유형입니다. 답변에 대한

Partially applying type parameters

+0

덕분에,이 방향으로 더 깊이보고, 나는 기능 대신 클래스를 사용할 수 있는지 확인합니다. –