F# 如何使记录实现接口?

F# 如何使记录实现接口?,f#,F#,如果我有一个接口: type IData = abstract member firstName: string abstract member lastName: string 如何定义符合此接口的记录类型 我尝试了以下方法: > type Data = { firstName: string; lastName: string } interface IData ;; Snippet.js(43,63): error FS0366: No implementation

如果我有一个接口:

type IData = 
  abstract member firstName: string
  abstract member lastName: string
如何定义符合此接口的记录类型

我尝试了以下方法:

> type Data = { firstName: string; lastName: string } interface IData ;;


Snippet.js(43,63): error FS0366: No implementation was given for 'abstract member IData.firstName : string'. Note that all interface members must be implemented
and listed under an appropriate 'interface' declaration, e.g. 'interface ... with member ...'.
请参阅以下记录:

记录字段与类的不同之处在于,它们自动公开为属性

我的第一个问题是:如果属性是“自动公开”的,那么为什么我需要“做点什么”来实现它们呢

由于错误消息要求我提供接口的实现,我尝试了以下操作:

> type Data = { firstName: string; lastName: string; } interface IData with
-   member this.firstName with get () = this.firstName
-   member this.lastName with get () = this.lastName 

type Data =
  {firstName: string;
   lastName: string;}
  with
    interface IData
  end 
到目前为止还不错,但是现在当我尝试使用它时,我遇到了一些问题:

> let d: IData = { firstName = "john"; lastName = "doe" } ;;

error FS0001: This expression was expected to have type
    'IData'
but here has type
    'Data'
另一次尝试:

> let d = { firstName = "john"; lastName = "doe" }
- ;;
val d : Data = {firstName = "john";
                lastName = "doe";}

> let d2: IData = d ;;


C:\Users\loref\Workspace\source-nly10r\Untitled-1(25,17): error FS0001: This expression was expected to have type
    'IData'
but here has type
    'Data'
因此,我的第二个问题是,如果
Data
实现了
IData
,那么为什么我不能将
Data
类型的值赋给
IData
类型的变量?

正如前面所指出的,隐式接口实现是由F#实现者实现的,目前还不可用

Wrt。我的第二个问题是,需要明确的铸造:

> let d2: IData = d :> IData ;;
val d2 : IData = {firstName = "john";
                  lastName = "doe";}

那是不可能的。您必须手动添加这些方法。看到这个建议,但即使我这样做了,我似乎也不能依赖接口。你需要显式地强制转换。在建议中,他们似乎把两个建议混为一谈。但是如果你问我,我赞成第一个,反对第二个。我明白了,谢谢你的解释。
upcast d
在这种情况下是
d:>IData
的有效替代方案