5

Nim で型クラスを簡単に使用しようとしています。私は今朝から Nim しか使っていないので、ばかげたことをしている可能性があることを覚えておいてください。

とにかく、 type の値のストリームを生成する疑似乱数ジェネレーターを定義したいと思います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

Uniformこれを使用して、間隔で float 値を生成するジェネレーターを定義するとします。私が試してみました

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)

nextminおよびの明白な定義は省略しmaxます。

ただし、上記はコンパイルされません。Error: 'BoundedGenerator' is not a concrete type

LinearCongruentialGeneratorの代わりに明示的に配置するとBoundedGenerator[int]、everyting がコンパイルされますが、もちろん、より洗練されたジェネレーターを切り替えられるようにしたいと考えています。

コンパイラエラーを理解するのを手伝ってくれる人はいますか?

4

1 に答える 1

7

Nim の型クラスは、Haskell の型クラスや C++ のインターフェイスの場合と同様に、抽象多相型の作成には使用されません。代わりに、それらは C++ の概念提案にはるかに似ています。これらは、ジェネリック関数のオーバーロード解決基準として使用できる一連の任意の型要件を定義します。

抽象型を使用する場合は、共通の基本型で型階層を定義してメソッド (複数の dispatchを使用) を使用するか、独自の vtable ベースのソリューションを展開できます。将来、ユーザー定義の型クラスは、(オーバーロードの解決中に) 一致した値を別の型に自動的に変換する機能を取得します。これにより、互換性のあるインターフェイスを持つ型の値は、vtable を外部からオブジェクトに運ぶ「ファット ポインター」に変換できるため、vtable アプローチが非常に使いやすくなります (異なる抽象型を持つ多くのポインターを同じオブジェクトに対して作成できるという利点があります)。物体)。これらのメカニズムは、できれば 1.0 のリリース前に、今後数か月以内に実装する予定です。

Araq (Nim の主な作成者) には、特定の種類のクロージャのグループを最適化して、クロージャ環境をそれらの間で共有し、最終結果が従来の C++ ライクな vtable に非常に近い安価な表現にバンドルする計画もあります。・持ち物。

于 2015-01-15T11:10:11.980 に答える