4

私は F# を学んでおり、ThreadStatic シングルトンを実装したいと考えています。同様の質問で見つけたものを使用しています: F# How to implement Singleton Pattern (syntax)

次のコードでは、コンパイラはThe type 'MySingleton' does not have 'null' as a proper value.

type MySingleton = 
    private new () = {}
    [<ThreadStatic>] [<DefaultValue>] static val mutable private instance:MySingleton
    static member Instance =
        match MySingleton.instance with
        | null -> MySingleton.instance <- new MySingleton()
        | _ -> ()
        MySingleton.instance

このシナリオでインスタンスを初期化するにはどうすればよいですか?

4

3 に答える 3

8

[<ThreadStatic>]特に F# では、かなりぎこちないコードになると思います。これをより簡潔に行う方法があります。たとえば、次を使用しThreadLocalます。

open System.Threading

type MySingleton private () = 
  static let instance = new ThreadLocal<_>(fun () -> MySingleton())
  static member Instance = instance.Value
于 2012-11-09T15:20:03.000 に答える
4

別のF#yソリューションは、インスタンスをオプションとして保存することです

type MySingleton = 
    private new () = {}

    [<ThreadStatic>; <DefaultValue>]
    static val mutable private instance:Option<MySingleton>

    static member Instance =
        match MySingleton.instance with
        | None -> MySingleton.instance <- Some(new MySingleton())
        | _ -> ()

        MySingleton.instance.Value
于 2012-11-09T13:36:55.163 に答える
3

Ramon が言ったことに近く、AllowNullLiteral属性を型に適用します (既定では、F# で宣言された型は適切な値として「null」を許可しません)。

[<AllowNullLiteral>]
type MySingleton = 
    private new () = {}
    [<ThreadStatic>] [<DefaultValue>] static val mutable private instance:MySingleton
    static member Instance =
        match MySingleton.instance with
        | null -> MySingleton.instance <- new MySingleton()
        | _ -> ()
        MySingleton.instance
于 2012-11-09T12:54:46.620 に答える