Ответ 1
Вы не можете; нет синтаксиса для обновления "более чем одной изменяемой переменной" с одним присваиванием. Конечно, вы можете сделать
let newX, newY = Swap(x,y)
x <- newX
y <- newY
Это то, что у меня есть до сих пор.
let Swap (left : int , right : int ) = (right, left)
let mutable x = 5
let mutable y = 10
let (newX, newY) = Swap(x, y) //<--this works
//none of these seem to work
//x, y <- Swap(x, y)
//(x, y) <- Swap(x, y)
//(x, y) <- Swap(x, y)
//do (x, y) = Swap(x, y)
//let (x, y) = Swap(x, y)
//do (x, y) <- Swap(x, y)
//let (x, y) <- Swap(x, y)
Вы не можете; нет синтаксиса для обновления "более чем одной изменяемой переменной" с одним присваиванием. Конечно, вы можете сделать
let newX, newY = Swap(x,y)
x <- newX
y <- newY
Код, который вы прокомментировали, не работает, потому что, когда вы пишете "x, y", вы создаете новый кортеж, который является неизменным значением, поэтому его нельзя обновить. Вы можете создать изменяемый кортеж и затем перезаписать его с помощью функции подкачки, если хотите:
let mutable toto = 5, 10
let swap (x, y) = y, x
toto <- swap toto
Моим советом было бы изучить неизменяемую сторону F #, посмотреть, как вы можете использовать неизменяемые структуры для достижения того, что вы ранее делали бы с помощью изменяемых значений.
Rob
F # имеет параметры "по ссылке", как и С#, поэтому вы можете написать классическую функцию свопинга аналогично:
let swap (x: byref<'a>) (y: byref<'a>) =
let temp = x
x <- y
y <- temp
let mutable x,y = 1,2
swap &x &y
Чтобы расширить ответ Роберта:
let swap (x : int, y : int) = y, x
let mutable x = 5
let mutable y = 10
let mutable xy = x, y
xy <- swap xy
Позволяет изменять переменные и кортеж.