gpt4 book ai didi

typeclass - Nim 中的类型类

转载 作者:行者123 更新时间:2023-12-02 00:10:02 26 4
gpt4 key购买 nike

我正在尝试在 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

假设我想用它来定义在一个区间内生成浮点值的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)

我省略了 nextminmax 的明显定义。

但是,由于错误:'BoundedGenerator'不是具体类型,上述内容无法编译

如果我明确地用 LinearCongruentialGenerator 代替 BoundedGenerator[int],一切都会编译,但我当然希望能够切换更复杂的生成器。

谁能帮我理解编译器错误吗?

最佳答案

Nim 中的类型类并不像 Haskell 的类型类和 C++ 的接口(interface)那样用于创建抽象多态类型。相反,它们与 C++ 的概念提案更加相似。它们定义了一组任意类型要求,可以用作通用函数的重载解析标准。

如果您想使用抽象类型,您可以定义具有公共(public)基类型的类型层次结构并使用方法(使用 multiple dispatch ),也可以推出您自己的基于 vtable 的解决方案。将来,用户定义的类型类将能够自动将匹配的值转换为不同的类型(在重载解析期间)。这将使 vtable 方法非常容易使用,因为具有兼容接口(interface)的类型的值将可转换为“胖指针”,将 vtable 从外部携带到对象(好处是可以为同一对象创建许多具有不同抽象类型的指针)目的)。我将在接下来的几个月内实现这些机制,希望在 1.0 版本发布之前。

Araq(Nim 的主要作者)也有一些计划,用于优化捆绑在一起的某种类型的闭包组,以更便宜的表示形式,其中闭包环境在它们之间共享,最终结果非常接近传统的 C++ -类似vtable携带对象。

关于typeclass - Nim 中的类型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27949378/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com