正在创建一个具有泛型成员的F#对象



在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的一般约束的值。在这里,充分泛型意味着在泛型类型之上一个顺序的类型。

最新更新