我的问题与此有些相关 -具有泛型参数类型的函数- 但我不太清楚如何做我想做的事。
我想定义一个“后代函数”来包装对各种 C# 类上“后代”的调用,如下所示:
让后代名称 (xDocument:XDocument) = xDocument.后代名称
让后代名称 (xElement:XElement) = xElement.后代名称
这种方法行不通,因为我们对“后代”有重复的定义。
我认为可以使用内联函数并静态解析参数来定义以下方法来执行此操作:
let inline descendants name (xml : ^x when ^x : (member Descendants : XName -> seq<XElement>)) =
xml.Descendants name
但当我尝试这样做时遇到此错误:
根据此程序点之前的信息查找不确定类型的对象。在此程序点之前可能需要类型注释来约束对象的类型。这可以使查找得以解决。
有没有办法可以编写第二个函数来执行我想要的操作?
一般来说,我认为帽子类型如^x
可能被使用太多了(至少从 SO 上有关它们的问题数量来看)。这是一个强大的功能,但它实际上主要是为了解决通用算术问题而设计的。我认为它们会使 F# 程序变得不必要的复杂。
如果您正在与XDocument
and XElement
,那么答案很简单,因为你可以使用XContainer
这是他们的共同基类并且具有Descendants
method:
let descendants name (xml:XContainer) = xml.Descendants(name)
// Both of these will work fine
descendants (XName.Get "foo") xd
descendants (XName.Get "foo") xe
如果你找不到共同的基类,那么你当然可以使用^a
类型,但您也可以使用正常重载,这在 F# 中是可能的,但仅适用于对象类型成员:
type Xml =
static member Descendants(name, x:XDocument) = x.Descendants(name)
static member Descendants(name, x:SomeOtherClass) = x.SomeOtherDescendants(name)
// The usage looks like this:
Xml.Descendants(XName.Get "foo", xd)
Xml.Descendants(XName.Get "foo", new SomeOtherClass())
(由于您引用的问题的答案已经表明重载适用于成员,因此这对您来说可能不是什么新鲜事。但对于将来发现此问题的其他人可能有用)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)