F#中全局变量的样式指南

时间:2011-05-18 06:35:48

标签: f# coding-style global-variables

对于我正在研究的项目,我需要一个全局变量(技术上我没有,我可以构建它然后将它传递给每个函数调用,让每个函数调用都知道它,但这似乎只是因为hacky,不太可读和更多的工作。)

全局变量是游戏的查找表(最后阶段,开始书和转置/缓存)。

事实上,某些代码可能会失去一些不负责任的行为,实际上就是简单(加速),是的,我知道全局可变状态很糟糕,在这种情况下它确实值得(10x +性能提升)

所以这就是问题,“在一个带有组合器的静态类中构建单例或使用静态值”

它们实际上完全相同,但我很好奇人们之前在这类问题上所做的事情

或者,如果我将这个东西传递给每个人(或者至少是对它的引用),那真的是最好的答案吗?

3 个答案:

答案 0 :(得分:4)

这是一个类似于@Yin Zhu发布的解决方案,但使用抽象类型指定可变值的使用接口,封装它的本地定义和提供实现的对象文字(这取自Expert F# - 由Don Syme共同撰写):

type IPeekPoke =
    abstract member Peek: unit -> int
    abstract member Poke: int -> unit

let makeCounter initialState =
    let state = ref initialState
    { new IPeekPoke with
        member x.Poke(n) = state := !state + n
        member x.Peek() = !state }

答案 1 :(得分:3)

您也可以使用静态字段来执行此操作,如下所示:

type Common() = 

    static let mutable queue : CloudQueue = null
    static let mutable storageAccount : CloudStorageAccount = null

    static member Queue 
        with get() = queue
        and set v = queue <- v
    static member StorageAccount 
        with get() = storageAccount
        and set v = storageAccount <- v

在另一个模块中,只需:

open Common
Common.Queue <- xxxx

答案 2 :(得分:2)

这是F#PowerPack Matrix库(\src\FSharp.PowerPackmath\associations.fs)中使用的约定:

// put global variable in a special module
module GlobalAssociations =
    // global variable ht
    let ht = 
        let ht = new System.Collections.Generic.Dictionary<Type,obj>() 
        let optab =
            [ typeof<float>,   (Some(FloatNumerics    :> INumeric<float>) :> obj);
              typeof<int32>,   (Some(Int32Numerics    :> INumeric<int32>) :> obj);
                  ...
              typeof<bignum>,  (Some(BigRationalNumerics   :> INumeric<bignum>) :> obj); ]

        List.iter (fun (ty,ops) -> ht.Add(ty,ops)) optab;
        ht

    // method to update ht
    let Put (ty: System.Type, d : obj)  =
        // lock it before changing
        lock ht (fun () -> 
            if ht.ContainsKey(ty) then invalidArg "ty" ("the type "+ty.Name+" already has a registered numeric association");
            ht.Add(ty, d))