2017-10-16 30 views
2

考虑以下几点:与构造提供的实施一般会员

type Foo(bar:'a -> 'a list) = 
    member __.Bar = bar 

我得到一个警告在参数列表中的第一个'a说:

这种结构导致代码是小于通用由类型注释表示。类型变量'a被约束为类型'obj'。

为什么我会收到此警告?

在这个特定的例子中,是否有一个成员可以将任意类型的值转换为这种类型的列表并让该成员通过构造函数提供? (有人可能会如想象Foo被实例化List.replicate x为该用户选择任意整数x。)

我不想让自己Foo通用的,因为我有很多这样的参数和成员。

(我想这个的原因是我想要的某种结构的,除其他事项外,包含用户覆盖的通用功能。)

回答

3

即使你做Foo通用的,你不需要调用它的时候,如果他们可以推断,明确规定了通用的参数:

type Foo<'a>(bar:'a -> 'a list) = 
    member __.Bar = bar 

Foo(fun x -> [x + 1]) 

我不知道如果这能帮助你,但在一般"Functions lose genericity when passed as values"

+0

谢谢,链接帮助。我不知道那件事。 – cmeeren