我正在尝试在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
有什么想法吗?
答案 0 :(得分:2)
这是从签名文件中的抽象类继承的正确语法:
[<JavaScript; Sealed>]
type Visual =
class
inherit Artefact
end
解释(我认为)。在我上面的问题中使用的语法中,编译器不理解类型是类。并非所有类型都可以继承,因此您有编译器的抱怨。
在我在这个答案中使用的语法中,我明确声明类型是一个类。我不知道这种语法,我只看过“类结束”,我从没想过你可以在这两个关键字之间添加内容。
感谢上面的回应。如果您不知道语法,则自动生成.fsi文件。这将为您提供语法,您可以自定义和清理。有关自动签名文件生成,请参阅此帖子: Automated F# Signature File (.fsi) Generation