2016-08-02 4 views
4

나는 특성이 Foo[A, B]이라고 가정합니다.형식 매개 변수의 형식 매개 변수를 Scala의 매개 변수화 된 클래스에 전파 할 수 있습니까?

Foo으로 매개 변수화 된 Bar 클래스를 정의하고 Bar 메소드에 Foo 유형 매개 변수를 다시 사용하고 싶습니다. (이 코드는 컴파일되지 않습니다) 아래 그림과 같은 무언가 :

trait Bar[Foo[A, B]] { 
    def doSmth[C](A => C): C 
} 

비슷한 무언가를 달성하기 위해 어떤 방법이 여전히 Bar 선언에서 단지 하나의 형식 매개 변수가?

p.s. 누군가가 설명 된 내용에 대해 올바른 용어를 제안 할 수 있다면 또한 좋을 것입니다.

+0

'Foo'가 특성 인 경우 유형 인수 내에 포함시키는 목적은 무엇입니까? 유스 케이스 란 무엇입니까? –

+0

@ m-z :'Bar'를 기반으로 계산 체인을 만들려고합니다. (그래도'Monad '라고 불릴 지 모르겠습니다.) 'Foo [A, B]'는 현재 계산 단계를 나타내며,'Function1'처럼 smth 일 수 있습니다. 나는 'Bar'부분이 그 타입에 계산 컨텍스트를 가지고 있기를 정말로 원합니다. – Roman

+0

'바 '에서'푸'에 대해 알고 싶습니까? 또는 형식 매개 변수 만? 즉, 여러 개의 유형 매개 변수가있는 경우 Bar [A, B] 또는 Foo [A, B, F [A, B]'가됩니까? –

답변

1

잘 모르겠지만 어딘가에 가고 싶은 곳 근처에있을 수도 있습니다.

trait Foo[A,B] 
trait Bar[A] { self: Foo[A,_] => 
    def doSmth[C](atoc: A => C): C 
} 

또는 유형 별명을 사용하십시오.

trait Foo[A,B] {type FooA = A} 
trait Bar { self: Foo[_,_] => 
    def doSmth[C](atoc: FooA => C): C 
} 

는 믹스에 Bar이 때 Foo이 필요하다는 것을 의미한다.

1

# 연산자를 사용하여 클래스 또는 특성의 유형 멤버에 액세스 할 수 있습니다.

trait M { 
    type A 
    type B 
    } 

    class F[X,Y] extends M { 
    type A = X 
    type B = Y 
    } 

    trait Bar[F] { 
    def doSmth[C](x: M#A => M#B): C 
    } 
관련 문제