如何从fsharp签名文件中的抽象类继承?

时间:2015-11-14 21:06:32

标签: inheritance syntax f# abstract-class signature-files

我正在尝试在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

“inherit”行无法编译。那么正确的语法是什么?

我试过这些(这也行不通):

1)Artefact之后的括号

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

2)Visual之后的括号

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

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

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

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

在我在这个答案中使用的语法中,我明确声明类型是一个类。我不知道这种语法,我只看过“类结束”,我从没想过你可以在这两个关键字之间添加内容。

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