2010-12-02 3 views
4

다른 유형의 다른 멤버 (컨텍스트에서 "추가 된"의미)에 추가 할 수있는 값에 대해 작동하는 함수를 작성하고 싶습니다. 이러한 유형의 명백한 (ㅎ - ㅎ) 정의 :자기 참조 형 타이핑

type Addable = { def +(a : Addable) : Addable } 

나에게 나는 전혀 이해하지 못하는 오류를 제공합니다 : 재귀 방법 + 요구 사항이 발생할 유형

왜 마지막 : Addable 아니다 결과 유형? 어쨌든 +가 재귀라고 생각하는 이유는 무엇입니까?

하지만 자신의 정의 내부 형식을 참조하기 위해 노력하고,보다 일반적인 문제를 발견

type T = { def f: T }  

을하지만 그때 나는 뇌파를했다 : 그것을 나는 자바에서와 방법을 해결!

type T[T] = { def f: T } 

이 컴파일됩니다!

하지만 이제는 두 가지 문제가 더 있습니다.

첫째,

def n(a:T) = a.f 

는 동안 오류가 전적으로 합리적인 아직 실망 "T는 매개 변수를 입력합니다 유형"을 부여하는 방법을 특히 T 형식을 사용하는 아무 생각이 없습니다. 원래 문제

type Addable[Addable] = { def +(a : Addable) : Addable } 

이 패턴을 적용하려고 시도하는 두 번째

는 "그 정제 외부에서 정의하는 추상 형식을 참조하지 않을 수 있습니다 구조적 정제의 매개 변수 유형"완전히 이해할 리드. (- 하나님과 마틴 감사합니다, 그건 내 머리를 엉망을 완료 할 것이기 때문이다 - 실제 문제는 "+"의 것이 아니다. 그것은 매개 변수로 한 Addable 소요 단지) 그래서

  1. "같은 유형의 값을 반환하는 특정 함수가 있습니까?"라는 오리 유형을 어떻게 정의합니까?
  2. 오리 유형 정의 "매개 변수와 같은 유형의 표현식을 사용하는 특정 기능이 있습니까?"라는 의미는 어떻게 정의합니까?

나는이 문제를 해결할 수 있다는 종교적 신념을 가지고 있습니다.

+2

참조 http://stackoverflow.com/questions/3466100/are-recursive-structural-types-not-supported-in-scala-anymore 및 http://stackoverflow.com/questions/3201577/scala-how-to-define-a-structural-type-that-itself-itself- –

답변

13

이들은 서로 다릅니다.

scala> type T[T] = { def f: T } 
defined type alias T 

scala> var x: T[Int] = null 
x: T[Int] = null 

scala> x = new AnyRef { def f = 5 } 
x: T[Int] = [email protected] 

당신은 쓸 때 :

type Addable[Addable] = { def +(a : Addable) : Addable } 

또한 한 Addable라는 단일 유형의 매개 변수를 취 유형 한 Addable 있습니다. 사람들이 자주 혼동하는 유사한 변형이 있습니다.

scala> def f[Int](x: Int) = x * x 
<console>:7: error: value * is not a member of type parameter Int 
     def f[Int](x: Int) = x * x 
          ^

질문에 대한 실제 대답은 "당신이 할 수없는"하지만 난 당신의 종교와 같은 믿음이 그래서 대신 내가 말할 것이다 산산조각 싫어하다 "구조 유형은 신비로운 방식으로 작동합니다." 종교적 사명을 계속하고 싶다면 여기를 방문하면 될 수없는 이유를 설명합니다.

http://article.gmane.org/gmane.comp.lang.scala/7013

+0

죽어라, 이단자! 사실,이 기사는 JVM에서 이것을 할 수없는 이유를 분명히했습니다. 스칼라가 모든 타입 문제를 마침내 해결할 수 있기를 바랬습니다. 아, 그럼. 퀘스트가 계속됩니다. – Malvolio

+0

링크 된 기사 참조 : getMethod에는 정적 유형이 필요하지 않습니다. Class 객체가 필요합니다. 'subject.getClass.getMethod ("$ plus", Array (subject.getClass))'와 같은 것이 작동해야합니다. 그래서 나는 여전히 좌절감을 느낀다. – IttayD

관련 문제