2012-10-12 3 views
2

스칼라 2.9.2에서 맵핑 된 래퍼를 더 높은 종류의 유형을 가진 값으로 만들고 유형 시스템과 관련되어 있습니다. 여기에 문제가 설명하는 코드의 삭감 버전 : 나는 시도하고이를 컴파일 할 때스칼라의 일치하는 유형 제약 조건이 실패합니다.

trait A 

trait B[C] { 
    def c: C 
} 

trait E[C <: B[C], D <: A] 

case class MyMap[M <: A, L <: B[L], N[L, M]](map: Map[M, N[L, M]]) 

object MyMap { 
    def empty[M <: A, L <: B[L], N[L, M]] = MyMap(Map.empty[M, N[L, M]]) 
} 

val myMap = MyMap.empty[A, T forSome { type T <: B[T] }, E] 

이 마지막 문장은 I 형 경계와 일치하지 않는하고 있음을 나타냅니다 컴파일러 오류와 함께 실패합니다. 그러나 나는 나처럼 보입니다. 아마도 N [L, M]이고 이전에 L < : B [L] 였을 것입니다. N [L, M]의 L이 동일하다는 것을 추측하지 못합니다 L < : B [L]를 한 다음, 마찬가지로 M. 오차대로 다음을 따르지 않는 : 타입 인자 (E A, T forSome {B [T] 타입 T <이})의

가지 예상되는 종류의 유형 매개 변수 (유형 M, 유형 L, 유형 N). 유형의 매개 변수가 유형 N의 예상 매개 변수와 일치하지 않습니다. 유형 C의 경계> : 없음 < : B [C]가 유형 L의 선언 된 경계보다 더 엄격합니다. < : 임의, 유형 D의 경계> : 없음 < : A가 유형보다 엄격합니다. 아무것도 < : M의는 경계>를 선언 된

발에는 myMap = MyMap.empty [A, T forSome {T 형 < : B [T]}, E]

감사받은 어떤 조언.

감사합니다 - 일 두 번째 매개 변수에 문제가 세 번째로 하나가

답변

2

. 나는 두 번째 매개 변수에 대해 모른다. 나는 실존 증서로 무엇이 허용 될지 모른다. 그래서 이것은 세 번째 매개 변수에 관한 문제입니다.

같은 오류와 간단한 코드의 비트 :

class A {} 

class C[X <: A] {} 

def f[X[_]] = 12 

f[List] 
res1: Int12 
f[C] 
error: kinds of the type arguments (C) do not conform to 
the expected kinds of the type parameters (type X). 
C's type parameters do not match type X's expected parameters: 
    type X's bounds >: Nothing <: A are stricter 
    than type _'s declared bounds >: Nothing < : Any 
     f[C] 
     ^

아주 간단하게, 세 번째 유형 매개 변수로 방법 빈 예상하는 두 개의 매개 변수 제한없이와 일반적인 유형입니다. 비어있는 본문에서는 N[Int, String] 또는 무엇이든 쓸 수 있습니다. 일부 제약이있는 E 유형은 N[_, _]이 아니라 LM과 약간 호환되지 않는 이전 유형 매개 변수의 이름과 비교하여 호환되지 않습니다 (참고 : 내가 찾을 수 writing N[L,M). 고차원 매개 변수). 당신이
def g[X[_ <: A]] = 13 

다음 g[C]를 호출 위의 코드를 작성하는 경우

는 (아무 문제가 발생할 수 있습니다 예상대로 너무 좋아 g[List]) 괜찮습니다. 빈은 빠른 응답

Map.empty[M <: A, L <: B[L], N[X <: B[X], Y <: A]] 
+0

덕분 경우

마찬가지로, 코드는 (당신이 적당한 두 번째 매개 변수를 전달 제공) 작동합니다. 당신의 예제와 나의 특성 B를 사용하여, C가'클래스 C [X <: B [X]] {}'로 정의된다면, 어떻게 함수 g를 정의하겠습니까? – fhusb

+0

def g [X [Y [: B [Y]] (마지막 줄의 빈칸과 마찬가지로 N [X <: B [X] ...) –

+0

감사합니다. 그렇다면 C에 대한 것보다 더 이상 제약이없는 C의 목록을 말하고 싶다면 (이것이 일단 제거되면 실제 문제라고 생각합니다).나는 타입 인자 [T forSome {type T <: B [T]}]로 불평하는'val {List [C [T forSome {type T <: B [T]}]()'를 시도했다. 클래스 C의 유형 매개 변수 bounds [X <: B [X]] "를 준수합니다. – fhusb

관련 문제