Как вы возвращаете несколько значений и назначаете их изменяемым переменным?

Это то, что у меня есть до сих пор.

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)

Ответ 1

Вы не можете; нет синтаксиса для обновления "более чем одной изменяемой переменной" с одним присваиванием. Конечно, вы можете сделать

let newX, newY = Swap(x,y)
x <- newX
y <- newY

Ответ 2

Код, который вы прокомментировали, не работает, потому что, когда вы пишете "x, y", вы создаете новый кортеж, который является неизменным значением, поэтому его нельзя обновить. Вы можете создать изменяемый кортеж и затем перезаписать его с помощью функции подкачки, если хотите:

let mutable toto = 5, 10 

let swap (x, y) = y, x

toto  <- swap toto

Моим советом было бы изучить неизменяемую сторону F #, посмотреть, как вы можете использовать неизменяемые структуры для достижения того, что вы ранее делали бы с помощью изменяемых значений.

Rob

Ответ 3

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

Ответ 4

Чтобы расширить ответ Роберта:

let swap (x : int, y : int) = y, x
let mutable x = 5
let mutable y = 10
let mutable xy = x, y

xy <- swap xy

Позволяет изменять переменные и кортеж.