Функция 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 используется недопустимым образом, что изменяемые переменные не могут быть захвачены замыканиями.

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


person Electric Coffee    schedule 23.04.2013    source источник


Ответы (1)


Как указано в сообщении об ошибке, вместо этого вы можете использовать ячейку 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 делает вещи несколько более явными и менее подверженными ошибкам (см. http://lorgonblog.wordpress.com/2008/11/12/on-lambdas-capture-and-mutability/ для дальнейшей разработки).

person kvb    schedule 23.04.2013
comment
и что бы это сделало? пожалуйста, объясните подробнее, я полный нуб в этом языке - person Electric Coffee; 23.04.2013
comment
@ElectricCoffee - я добавил дополнительные пояснения. Я убедился, что мой код работает, поэтому я удивлен, что у вас возникли проблемы с ним. Вы уверены, что удалили свой старый код? - person kvb; 23.04.2013
comment
оказалось, я на мгновение сошел с ума и забыл удалить mutable после применения ваших изменений к моему коду... теперь все работает, спасибо! - person Electric Coffee; 23.04.2013
comment
@ElectricCoffee В настоящее время я читаю «Функциональное программирование в реальном мире», и глава, которую я сейчас читаю, как раз посвящена этой теме. Книга отлично подходит для тех, кто имеет опыт работы с C# и изучает F#. manning.com/petricek - person N_A; 24.04.2013