泛型和公共字段的多态性

时间:2018-04-01 12:20:00

标签: f#

如果这个question回答并且有些类似,但是这个问题需要使用泛型,同时强制参数类型有一些共同的字段。

type Document = {
    Name: string
    Version: string
}

let inline requestData<'t> (document: 't) =
    Console.WriteLine(document.Name)
    Console.WriteLine(document.Version)

测试

requestData<Document>({Name = "test"; Version="259723983"})

我得到的错误是

  

根据此程序点之前的信息查找不确定类型的对象。在此程序点之前可能需要类型注释来约束对象的类型。这可能允许解析查找。

修改

let inline requestData<'t> (document: 't) =
    let name = (^document: (member Name: string)(document))
  

此处不能使用声明的类型参数t',因为在编译时无法解析type参数。

1 个答案:

答案 0 :(得分:1)

您需要约束类型而不是文档参数。此外,'T表示法用于通常的泛型,而不是SRTP。如果您坚持添加类型参数(不确定原因),则可以使用以下方法进行定义:

let inline requestData< ^a when ^a : (member Name : string)  > x =
    Console.WriteLine(^a: (member Name: string)(x))

这样你可以这样写:

open System

type Document = {
    Name: string
    Version: string
}

type OtherDoc = {
    Name: string
    Version: string
}

let doc1 = {Document.Name = "Joe"; Version = "123"}
let doc2 = {OtherDoc.Name = "Jim"; Version = "456"}

requestData doc2
requestData doc1

或者:

requestData<Document> doc1 //Joe
requestData<OtherDoc> doc2 //Jim

这将是一个错误:

requestData<Document> doc2 //error FS0001: This expression was expected to have type...