为什么无法推断泛型类型?
Why is a generic type unable to be inferred?
我刚开始使用 Nim,对泛型有疑问。
这是一个简化的示例,它复制了我遇到的问题。从具有通用类型 T
的简单对象类型开始,并创建它的实例:
type Foo[T] = object
bar: T
var my_foo = Foo[string](bar: "foobar")
如果我创建一个具有通用类型 T
的 proc
和 T
的 return 值,然后 return bar
对象的字段,类型为T
:
# This works!
proc test[T](f: Foo, n: int): T =
f.bar
echo test(my_foo, 1)
但是,如果我想 return 来自类型 T
的 Foo.bar
字段的一系列 T
的多个副本,如下所示:
# This fails!
proc test2[T](f: Foo, n: int): seq[T] =
var s: T = f.bar
var r: seq[T] = @[]
for x in 1..n:
r.add(s)
result = r
echo test2(my_foo, 3)
然后我得到以下错误:
Error: cannot instantiate: 'T'
任何人都可以提供任何关于为什么会这样以及如何正确执行此操作的见解吗?
不确定这是什么内部原因,但 Nim 中的类型推断可能太局限了。无论如何,我认为通过编写 Foo[T]
来显式声明 Foo
的实例化是一种很好的风格,如下所示:
proc test2[T](f: Foo[T], n: int): seq[T] =
我刚开始使用 Nim,对泛型有疑问。
这是一个简化的示例,它复制了我遇到的问题。从具有通用类型 T
的简单对象类型开始,并创建它的实例:
type Foo[T] = object
bar: T
var my_foo = Foo[string](bar: "foobar")
如果我创建一个具有通用类型 T
的 proc
和 T
的 return 值,然后 return bar
对象的字段,类型为T
:
# This works!
proc test[T](f: Foo, n: int): T =
f.bar
echo test(my_foo, 1)
但是,如果我想 return 来自类型 T
的 Foo.bar
字段的一系列 T
的多个副本,如下所示:
# This fails!
proc test2[T](f: Foo, n: int): seq[T] =
var s: T = f.bar
var r: seq[T] = @[]
for x in 1..n:
r.add(s)
result = r
echo test2(my_foo, 3)
然后我得到以下错误:
Error: cannot instantiate: 'T'
任何人都可以提供任何关于为什么会这样以及如何正确执行此操作的见解吗?
不确定这是什么内部原因,但 Nim 中的类型推断可能太局限了。无论如何,我认为通过编写 Foo[T]
来显式声明 Foo
的实例化是一种很好的风格,如下所示:
proc test2[T](f: Foo[T], n: int): seq[T] =