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
,
min
및
max
의 명백한 정의를 생략 노력했다.
위, 그러나, 내가 명시 적으로 BoundedGenerator[int]
대신, everyting 컴파일에 LinearCongruentialGenerator
을 넣으면 인해 Error: 'BoundedGenerator' is not a concrete type
에, 컴파일하지만, 물론 좀 더 정교한 발전기를 전환 할 수 싶지 않습니다.
누구든지 컴파일러 오류를 이해할 수 있습니까?
multimethod와 vtable은 모두 런타임시 동적 디스패치를 사용하지만 대부분의 경우에는 필요하지 않습니다. 사실 대개 대부분의 유형 정보는 컴파일 타임에 알려지며 올바른 구현의 해결책은 정적 일 수 있습니다. 사실, 이제는이 에러를 더 잘 이해할 수 있다고 생각합니다. Nim typeclasses와 C++ 인터페이스의 차이점과 관련이없는 것으로 보입니다. 대신, BoundedGenerator [int]의 구현이 가변 크기를 가질 수 있으므로 Nim이 'Uniform'에 대한 올바른 크기를 결정할 수 없다고 생각합니다. – Andrea
글쎄, 내가 컴파일러에 추가 한 이후로이 오류의 의미를 알아야합니다. BoundedGenerator [int]는 인스턴스화 할 수있는 특정 유형이 아닙니다. BoundedGenerators처럼 작동하는 유형의 카테고리에 대한 검증 가능한 설명 일뿐입니다. 해당 설명에 맞는 많은 구체적인 객체 유형을 생성 할 수 있습니다. – zah