请考虑以下事项:
type Foo(bar:'a -> 'a list) =
member __.Bar = bar
我在参数列表中的第一个'a
上收到警告:
此构造导致代码不像类型注释所指示的那样通用。类型变量'a已被约束为类型'obj'。
为什么我会收到此警告?
在这个具体的例子中,是否可以有一个成员将任意类型的值转换为这种类型的列表并通过构造函数提供该成员? (例如,可以假设Foo
用List.replicate x
实例化用户选择的任何整数x
。)
我不想让Foo
本身通用,因为我有很多这样的参数和成员。
(我之所以这样做是因为我想要某种结构,除其他外,还包含用户可覆盖的泛型函数。)
答案 0 :(得分:3)
即使你使Foo
通用,如果可以推断它们,你也不需要在调用它时显式提供通用参数:
type Foo<'a>(bar:'a -> 'a list) =
member __.Bar = bar
Foo(fun x -> [x + 1])
我不确定这对你有帮助,但总的来说是"Functions lose genericity when passed as values"。