2015-11-14 39 views
1

我想在FSharp中建模一个域。我希望客户端代码体验对这些类型的干净访问。所以部分是通过创建一个签名文件(.fsi)来描述:https://msdn.microsoft.com/en-us/library/dd233196.aspx如何从fsharp签名文件中的抽象类继承?

Microsoft页面没有描述如何在FSharp签名文件中继承。我确实发现了如何在这里用“接口”关键字指示接口实现: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)括号人工制品后后视觉

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

任何想法

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

2)括号?

+0

此类问题的最简单方法 - 编写实现文件并让编译器生成fsi文件。 –

+0

谢谢约翰,帮助。我已经发布了一个答案。 –

回答

2

这是正确的语法从一个抽象类继承,在签名档:

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

说明(在我看来)。在我上面的问题中使用的语法中,编译器不理解该类型是类。并非所有类型都可以继承,所以你有编译器的抱怨。

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

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