【问题标题】:Creating an F# object with a generic member使用泛型成员创建 F# 对象
【发布时间】:2020-05-06 15:42:31
【问题描述】:

在 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# 没有更高级别的类型,简单来说,这意味着函数在作为值传递时会失去其通用性。这有点相关:stackoverflow.com/a/42599144/180286

标签: f#


【解决方案1】:

编译错误的解释:

对象表达式构造匿名类 - 这些只是常规类,具有编译器生成的名称。您实际上是在创建一个捕获 f 的闭包。

这是您通常的实现方式:

type MyType =
    abstract MyMember<'a> : 'a -> int

type MyNewType (f) =
    interface MyType with
        member _.MyMember x = f x

该类型的构造函数将有一个f 类型的'a -&gt; int 参数,其中'a 通常由MyNewType 的第一次使用决定。

但是没有办法概括 f 以便它可以被捕获作为一个满足MyMember 的一般约束的值。这里足够泛型意味着比泛型类型高一阶的类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 2014-04-04
    • 1970-01-01
    • 2012-03-13
    • 2021-10-10
    • 1970-01-01
    相关资源
    最近更新 更多