Сопоставление с образцом изменяемых значений с использованием F # - PullRequest
3 голосов
/ 30 июня 2011

Я хотел бы указать на «рискованную» часть в F #.Рассмотрим следующий код

let mutable a, b as ab = 0, 0
a <- 4
a
ab

Вы получите a = 4 и ab = 0, 0.Вероятно, это правильное поведение, я просто хотел указать на это и узнать ваше мнение.Считаете ли вы это поведение логичным или нет, и почему?У меня есть некоторые проблемы, чтобы принять это, потому что я всегда предполагал, что (a, b) и ab должны быть идентичны.

Ответы [ 2 ]

5 голосов
/ 30 июня 2011

Если вы запустите let mutable a, b as ab = 0, 0 в F # интерактив, вы получите:

val mutable ab : int * int = (0, 0)
val mutable b : int = 0
val mutable a : int = 0

Что означает, что выражение создало 3 разных значения. Изменение одного значения не повлияет на другие значения

4 голосов
/ 30 июня 2011

Это правда, что поначалу это может сбивать с толку, но как только вы поймете, как F # обрабатывает объявление (как объяснил Анкур), это должно иметь смысл.

Вы можете получить другое поведение (гдеизменение одного значения также изменяет кортеж), если вместо mutable используются переменные ячейки:

let a, b as ab = ref 0, ref 0
a := 4
!(fst ab) // returns 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...