2015-01-14 6 views
3

Nim에서 타이프 클라스를 간단하게 사용하려고합니다. 오늘 아침 이후로 나는 Nim 만 사용 했으므로 바보 같은 짓을했을 수도 있습니다.님의 클래스 유형

어쨌든 T 유형의 값 스트림을 생성하는 의사 임의 생성기를 정의하고자합니다. 경우에 따라 T은 숫자이므로 도달 가능한 최소값과 최대 값에 대해 아는 것이 합리적입니다. 즉 값을 재조정하십시오. 여기에 내 타입이 있습니다

type 
    Generator*[T] = generic x 
    next(var x) is T 

    BoundedGenerator*[T] = generic x 
    x is Generator[T] 
    min(x) is T 
    max(x) is T 

나는 또한 그러한 인스턴스, 예를 들어 LinearCongruentialGenerator을 가지고 있습니다.

말하자면이 간격을 사용하여 float 값을 생성하는 Uniform 생성기를 정의하고 싶습니다. 나는

type Uniform* = object 
    gen: BoundedGenerator[int] 
    min_p: float 
    max_p: float 

proc create*(gen: BoundedGenerator[int], min: float, max: float): Uniform = 
    return Uniform(gen: gen, min_p: min, max_p: max) 

내가 next, minmax의 명백한 정의를 생략 노력했다.

위, 그러나, 내가 명시 적으로 BoundedGenerator[int] 대신, everyting 컴파일에 LinearCongruentialGenerator을 넣으면 인해 Error: 'BoundedGenerator' is not a concrete type

에, 컴파일하지만, 물론 좀 더 정교한 발전기를 전환 할 수 싶지 않습니다.

누구든지 컴파일러 오류를 이해할 수 있습니까?

답변

6

Nim의 유형 클래스는 하스켈의 유형 클래스 및 C++ 인터페이스의 경우와 같이 추상적 인 다형성 유형을 생성하는 데 사용되지 않습니다. 대신 C++의 개념 제안과 훨씬 비슷합니다. 그들은 일반 함수에 대한 과부하 해결 기준으로 사용할 수있는 임의의 유형 요구 사항 집합을 정의합니다.

추상 형식으로 작업하려는 경우 공통 기본 형식으로 형식 계층 구조를 정의하고 메서드 (multiple dispatch 사용)를 사용하거나 사용자 고유의 vtable 기반 솔루션을 롤백 할 수 있습니다. 앞으로 사용자 정의 유형 클래스는 일치 된 값을 다른 유형으로 자동 변환하는 기능을 얻게됩니다 (과부하 해결 중). 이것은 vtable 접근법을 사용하기가 매우 쉽습니다. 호환 인터페이스가있는 유형의 값은 vtable을 객체에 외부 적으로 전달하는 "뚱뚱한 포인터"로 변환 될 수 있습니다. (다른 추상 유형을 가진 많은 포인터가 동일한 객체에 대해 생성 될 수 있다는 이점이 있습니다. 목적). 앞으로 몇 달 안에이 메커니즘을 구현할 예정입니다. 1.0 이전에 릴리스되었습니다.

아라크 (Nim의 주 저자)는 클로저 환경이 그들 사이에서 공유되고 최종 결과가 전통적인 방식에 매우 가깝도록 저렴한 표기법으로 묶인 특정 유형의 클로저 그룹을 최적화하는 계획을 가지고 있습니다 C++ - vtable-carrying 객체와 비슷합니다.

+0

multimethod와 vtable은 모두 런타임시 동적 디스패치를 ​​사용하지만 대부분의 경우에는 필요하지 않습니다. 사실 대개 대부분의 유형 정보는 컴파일 타임에 알려지며 올바른 구현의 해결책은 정적 일 수 있습니다. 사실, 이제는이 에러를 더 잘 이해할 수 있다고 생각합니다. Nim typeclasses와 C++ 인터페이스의 차이점과 관련이없는 것으로 보입니다. 대신, BoundedGenerator [int]의 구현이 가변 크기를 가질 수 있으므로 Nim이 'Uniform'에 대한 올바른 크기를 결정할 수 없다고 생각합니다. – Andrea

+1

글쎄, 내가 컴파일러에 추가 한 이후로이 오류의 의미를 알아야합니다. BoundedGenerator [int]는 인스턴스화 할 수있는 특정 유형이 아닙니다. BoundedGenerators처럼 작동하는 유형의 카테고리에 대한 검증 가능한 설명 일뿐입니다. 해당 설명에 맞는 많은 구체적인 객체 유형을 생성 할 수 있습니다. – zah