2013-04-23 2 views
2

Вероятно вопрос другого немого F # для начинающего ... Но это мне пристанет все равноF # Функция не позволяет мне мутировать изменяемое значение

Я не могу найти ответы на этот онлайн ... может быть потому что я ищу неправильные термины, но а

в любом случае мой код выглядит следующим образом:

let counter() = 
    let mutable x = 0 

    let increment(y :int) = 
     x <- x + y // this line is giving me trouble 
     printfn "%A" x // and this one too 

    increment // return the function 

Visual Studio говорит мне, что x используется некорректным способом, что изменяемые переменные не могут быть захвачены затворы

Почему это так? и что я могу сделать, чтобы позволить мне мутировать его?

ответ

8

Поскольку сообщение об ошибке указывает, вы можете использовать ref ячейку вместо:

let counter() = 
    let x = ref 0 

    let increment(y :int) = 
     x := !x + y // this line is giving me trouble 
     printfn "%A" !x // and this one too 

    increment // return the function 

Это именно то, что ваш код будет делать, если бы это было законно. Оператор ! получает значение из ячейки ref, а := присваивает новое значение. Что касается этого, то это связано с тем, что семантика захвата изменчивого значения закрытием оказалась запутанной; использование ячейки ref делает вещи более ясными и менее подверженными ошибкам (см. http://lorgonblog.wordpress.com/2008/11/12/on-lambdas-capture-and-mutability/ для дальнейшей разработки).

+0

и что это будет делать? пожалуйста, объясните подробнее. Я полный noob на этом языке –

+0

@ElectricCoffee - я добавил дополнительные объяснения. Я подтвердил, что мой код работает, поэтому я удивлен, что у вас проблемы с ним - вы уверены, что удалили свой старый код? – kvb

+0

получилось, что я на мгновение искал и забыл удалить 'mutable' после внесения изменений в мой код ... он теперь работает! –