我正在尝试在FSharp中建模域。我希望客户端代码能够体验到对这些类型的干净访问。因此,其中一部分是通过创建签名文件(.fsi)来实现的,这里对此进行了描述:https://msdn.microsoft.com/en-us/library/dd233196.aspx
微软网页没有描述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)人工制品后的方括号
[<JavaScript; Sealed>]
type Visual =
inherit Artefact()
2) Visual后面的方括号
[<JavaScript; Sealed>]
type Visual() =
inherit Artefact
有什么想法吗?
发布于 2015-11-14 22:10:48
这是在签名文件中从抽象类继承的正确语法:
[<JavaScript; Sealed>]
type Visual =
class
inherit Artefact
end
解释(在我看来)。在我在上面的问题中使用的语法中,编译器不理解类型是一个类。并不是所有的类型都可以继承,所以你有编译器的抱怨。
在我在这个答案中使用的语法中,我显式地声明该类型是一个类。我不知道这个语法,我只看过"class end",我从来没有想过你可以在这两个关键字之间添加东西。
感谢上面的回应。如果你不知道语法,自动生成一个.fsi文件。这将为您提供语法,您可以对其进行自定义和清理。有关自动生成签名文件的信息,请参阅本文:Automated F# Signature File (.fsi) Generation
https://stackoverflow.com/questions/33713388
复制