在F#中,我定义了一个具有通用成员的接口:
type MyType =
abstract MyMember<'a> : 'a -> int
我想写一个函数,可以创建一个实现这个接口的对象:
module MyType =
let create f =
{
new MyType with
member __.MyMember(x) = f x
}
这当前无法编译,并显示以下错误消息:
This code is not sufficiently generic. The type variable 'a could not be generalized because it would escape its scope.
有可能通过内联和静态解析的类型参数(或类似的东西(来实现这一点吗?谢谢
编译错误的解释:
对象表达式构造匿名类——这些只是具有编译器生成名称的常规类。您实际上是在创建一个捕获f
的闭包。
这就是你通常实现它的方式:
type MyType =
abstract MyMember<'a> : 'a -> int
type MyNewType (f) =
interface MyType with
member _.MyMember x = f x
该类型的构造函数将具有类型为'a -> int
的参数f
,其中'a
通常由MyNewType
的第一次使用决定。
但是没有办法推广f
,使其可以被捕获为满足MyMember
的一般约束的值。在这里,充分泛型意味着在泛型类型之上一个顺序的类型。