gpt4 book ai didi

types - 静态解析类型参数

转载 作者:行者123 更新时间:2023-12-03 04:22:00 26 4
gpt4 key购买 nike

以下(简化的)代码片段取 self 正在实现的应用程序,该应用程序始终使用静态解析的类型参数。

type A< ^B when ^B : (static member MyMember : Unit -> Unit)> = {
Field : unit
}
type TestA = {
AField : A< BTy >
}
and BTy = {
BField : Unit
} with
static member MyMember () = ()

当我定义字段 AField ( AField : A< BTy > ) 的类型时,IntelliSense 给出以下错误:类型“BTy”不支持任何名为“MyMember”的运算符.

已编辑。单独声明它们是可行的,但是如果我有一个相互引用,并且我不能声明第三种类型放在顶部,其中包含两种类型的公共(public)信息。我应该怎么做才能避免这个问题?无论如何,如果我定义下面的定义 let pluto = ("" :> obj) :?> A< BTy >我想它是有效的,因为这两种类型都可以从 let 绑定(bind)中看到。

最佳答案

说实话,我有点惊讶你甚至可以在类型声明中使用静态成员约束,但正如@pad提到的,当你以正确的顺序放置声明并删除递归时,它有效(尽管我不确定当您转向更复杂的示例时不会有其他限制):

type A< ^B when ^B : (static member MyMember : Unit -> Unit)> = 
{ Field : unit }

type BTy =
{ BField : Unit }
static member MyMember () = ()

type TestA = { AField : A<BTy> }

无论如何,我认为在类型声明中使用静态成员约束有点复杂。一种更简洁的方法是定义一个接口(interface),清楚地描述(和记录)您需要的成员:

type IMyMember =
abstract MyMember : unit -> unit

现在,静态成员约束仍可用于从具有所需成员的类型创建接口(interface)的实现,但不实现接口(interface)。使用这种技术,您应该能够实现与类型上的静态成员约束完全相同的功能(但以更清晰的方式):

/// Captures 'IMyMember' implementation from another type using static constraints
let inline captureMyMember< ^B when ^B : (static member MyMember : Unit -> Unit)> =
{ new IMyMember with
member x.MyMember () =
(^B : (static member MyMember : Unit -> Unit) ()) }

例如,该函数将从您的 BTy 类型创建 IMyMember:

/// A type that contains field and a captured implementation of 'IMyMember'
type A =
{ Field : unit
Operations : IMyMember }

let it = { Field = ()
Operations = captureMyMember<BTy> }

此外,我在一篇文章中使用了相同的技术,展示了如何 write generic numeric code我认为它在那里工作得非常好。

关于types - 静态解析类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12881828/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com