2014-10-07 1 views
2

Есть ли какой-нибудь аналог в F #? Что-то вродеC++ - как статические переменные внутри функции F #

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

?

+0

Вам нужен доступ к этой переменной извне функции? Для чего это «статический» модификатор? – Petr

+0

@ Петр № Нет внешнего доступа. Я знаю, что это не «функциональный путь». Функция должна вызываться только один раз, поэтому меня интересует. –

ответ

7

Если вы desugar let f() = ... - let f = fun() -> ..., вы можете поместить объявление a внутри определения f, но перед началом функции п. Это сделает функцию закрытой над a, сохраняя a местным по отношению к f. Проблема заключается в том, что вы не можете закрывать переменные переменные, поэтому вместо этого вы должны использовать ссылку:

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

Отлично. Благодарю. –

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 

в модуле подхода, е видно, но т не

+0

Немного сложнее, чем вариант из sepp2k. Спасибо за помощь. –