2014-02-12 3 views
0

스칼라에서 실험하면서 나는 foo을 정의하는 모든 형식에 대해 함수를 정의하려고합니다. 간단한 케이스의 경우 Structural Typing으로 처리 할 수 ​​있지만, 타입 매개 변수가 필요할 때 분해됩니다. 여기 제네릭 형식 매개 변수가있는 구조형

사소한 예입니다 :

def reverse[A](xs: { def reverse(): A }): A = xs.reverse 

이 오류없이 컴파일하지만 다음과 같은 오류와 함께하는 reverse 기능을 정의하는 유형을 통과에 실패 : 나는 또한 시도했다

scala> reverse("string") 
<console>:13: error: type mismatch; 
found : String("adsf") 
required: AnyRef{def reverse(): ?} 
       reverse("adsf") 
        ^

형식 매개 변수 인 [A <: { def reverse(): A }]에 대한 구조적 경계를 정의하지만 같은 종류의 결과를 얻습니다. 여기에 유형 삭제의 희생자가 될 수 있습니다 (reverse의 결과가 ? 일 것으로 예상되는 것을 확인하십시오).

스칼라 타입 시스템에서 이런 종류의 타입 제약이 불가능하거나 확실하지 않은 것이 있습니다. 일반 매개 변수가있는 함수의 구조 유형을 정의하는 방법이 있습니까?


참고 :은 간략 주어진 예에서 내 문제가 reverse 실제로 StringOps하지 문자열에 정의되어 있는지이라고 생각했다. Unfortunatelly, 내 문자열을 StringOps 컨테이너에 포장해도 같은 문제가 발생합니다.

답변

2

이 나를 위해 작동합니다

def getReverse[A](xs: {def reverse: A}): A = xs.reverse 

scala> getReverse("1234") 
res10: scala.collection.immutable.WrappedString = 4321 

분명히 괄호 행함이없는 구조 유형에 reverse을 정의.

+0

분명히 빈 괄호를 포함 할 수 없습니다. 나는 그것을 단위체 또는 무엇인가 필요로 해석한다고 생각한다. 'def reverse [A] (xs : {def reverse : A}) : A = xs.reverse'를 사용하는 것이 좋으므로 명명은 문제가되지 않습니다. 이것은 훨씬 더 좋은 오류 메시지를 가질 수있는 것처럼 보입니다. – KChaloux

+0

그래, 내 수업만으로 시험해 봤어. 'def getValue : A'와'def getValue() : A' 함수는 구조형 '{get getValue : A}'에 의해 포착되지 않습니다. 기묘한. – KChaloux

+0

@KChaloux ok, 이름 범위 대신 괄호를 사용하는 답변을 업데이트하고 있습니다. – vptheron

관련 문제