2

(汎用) サービスを使用して IO アクションを実行するアプリケーションがあります。通常の IO 関数 (Save、SaveAs など) を F# 型に集約したいのですが、コンパイラはこの表記法を嫌うようです。

type InputService<'a> = {
    // Fine
    SomeFunc : 'a -> Option<'a>

    // Error (VS2012): "Anonymous type variables are not permitted in this declaration"
    Save : 'a -> ()

    // Error (see above)
    Load : () -> 'a
}

このようなステートフル関数が慣用的でない可能性があることは承知しています。実際には、UI プロンプトやファイル パスなどをカリー化する予定ですが、型でその関数シグネチャを定義することは可能ですか?

4

1 に答える 1

8

この表記法では、次のように書く必要があるようです

type InputService<'a> = {
    SomeFunc : 'a -> Option<'a>  
    Save : 'a -> unit
    Load : unit -> 'a
}

つまり、代わりにユニットを書き込みます()

ここでより簡単な例を見ることができます

let t : () = ();;

同じエラー メッセージが表示されますが、書き込みは正常にunit機能します。

これらのエラー メッセージの理由()は、 のような定数です1。書き込めないのは当然

let t : 1 = 1;;

したがって、同じことが当てはまります()

于 2013-09-15T10:41:05.860 に答える