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) アーティファクトの後の括弧

[<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」しか見たことがないので、これら 2 つのキーワードの間に何かを追加できるとは思いもしませんでした。

上記の回答に感謝します。構文がわからない場合は、.fsi ファイルを自動的に生成します。これにより、カスタマイズしてクリーンアップできる構文が得られます。署名ファイルの自動生成については、次の投稿を参照してください: Automated F# Signature File (.fsi) Generation

于 2015-11-14T22:10:47.520 に答える