2014-10-07 21 views
2

F#中是否存在一些模擬?類似於C++ - 類似F#函數中的靜態變量

let f() = 
    let mutable static a = 0 
    ... 

+0

你需要從函數外部訪問這個變量嗎?什麼是'靜態'修飾符? – Petr 2014-10-07 12:24:54

+0

@ Petr No.無外部訪問。我知道這不是一種「功能性方式」。一個函數只能調用一次,這就是爲什麼我感興趣。 – 2014-10-07 15:08:34

回答

7

如果desugar let f() = ...let f = fun() -> ...,您可以將a的聲明放入f的定義內,但在函數開始之前ñ。這將使功能關閉a,同時保留a本地到f。這個問題是你可能無法關閉可變變量,所以你需要使用一個ref:

let f = 
    let a = ref 0 
    fun() -> 
     .... 
+0

完美。謝謝。 – 2014-10-07 10:44:42

4

最簡單的模擬是功能之前,把設:

let mutable static a = 0 
let f() = 

如果你真的想隱藏你能包住父模塊在整個事情中的變量。

否則,序列表達式允許記憶函數中的變量,但是是一個非常重要的變化。

一些其他的想法 - 隱藏類中:

type t() = 
    static let mutable t = 1 
    static member f() = 1 

或模塊的方法模塊

module t = 
    let mutable private t = 1 
    let f() = 1 

,f是可見的,但t是否

+0

比sepp2k的變體稍微複雜一些。謝謝你的幫助。 – 2014-10-07 10:48:24