1

我正在尝试在 FSharp 中为域建模。我希望客户端代码能够体验对这些类型的干净访问。因此,其中一部分是通过创建签名文件 (.fsi),如下所述:https ://msdn.microsoft.com/en-us/library/dd233196.aspx

Microsoft 页面没有描述继承如何在 FSharp 签名文件中工作。我确实在这里发现了如何使用“interface”关键字指示接口实现:https ://github.com/intellifactory/websharper.ui.next/blob/master/WebSharper.UI.Next/Attr.fsi

好的。但我想更进一步,从一个抽象类继承,并在签名文件中指出这一点。

目标是多态性。在某个地方,我想要一个函数将参数“v”作为:(v : S list),其中 S 是超类型,列表可能包含其子类型的值。

但是从抽象类继承的 fsharp 签名文件中的语法是什么?

在“Artefact.fs”中,我有(是的,它是一个 Websharper 项目):

[<JavaScript; AbstractClass>]
type Artefact() =
    abstract member Visual : Doc with get

在“Visual.fsi”中,我有:

[<JavaScript; Sealed>]
type Visual = 
    inherit Artefact

“继承”行不编译。那么正确的语法是什么?

我尝试了这些(也不起作用):

1)Artefact 之后的括号

[<JavaScript; Sealed>]
type Visual = 
    inherit Artefact()

2) Visual 后面的括号

[<JavaScript; Sealed>]
type Visual() = 
    inherit Artefact

有任何想法吗?

4

1 回答 1

2

这是在签名文件中从抽象类继承的正确语法:

[<JavaScript; Sealed>]
type Visual = 
    class
        inherit Artefact
    end

解释(如我所见)。在我在上面的问题中使用的语法中,编译器不理解类型是一个类。并非所有类型都可以继承,因此您有编译器的抱怨。

在我在这个答案中使用的语法中,我明确声明该类型是一个类。我不知道这种语法,我只见过“class end”,而且我从没想过你可以在这两个关键字之间添加东西。

感谢楼上的回复。如果您不知道语法,则自动生成 .fsi 文件。这将为您提供可以自定义和清理的语法。有关自动签名文件生成的信息,请参阅此帖子: 自动 F# 签名文件 (.fsi) 生成

于 2015-11-14T22:10:47.520 回答