스칼라에서 실험하면서 나는 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
컨테이너에 포장해도 같은 문제가 발생합니다.
분명히 빈 괄호를 포함 할 수 없습니다. 나는 그것을 단위체 또는 무엇인가 필요로 해석한다고 생각한다. 'def reverse [A] (xs : {def reverse : A}) : A = xs.reverse'를 사용하는 것이 좋으므로 명명은 문제가되지 않습니다. 이것은 훨씬 더 좋은 오류 메시지를 가질 수있는 것처럼 보입니다. – KChaloux
그래, 내 수업만으로 시험해 봤어. 'def getValue : A'와'def getValue() : A' 함수는 구조형 '{get getValue : A}'에 의해 포착되지 않습니다. 기묘한. – KChaloux
@KChaloux ok, 이름 범위 대신 괄호를 사용하는 답변을 업데이트하고 있습니다. – vptheron