¿Cómo se puede devolver múltiples valores y asignarlos a variables mutables?
Pregunta
Esto es lo que tengo hasta ahora.
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)
Solución
No se puede; no hay sintaxis para actualizar 'más de una variable mutable' con una sola asignación. Por supuesto que puede hacer
let newX, newY = Swap(x,y)
x <- newX
y <- newY
Otros consejos
El código que ha comentado que no funciona porque cuando se escribe "x, y" se crea una nueva tupla que es un valor inmutable, por lo que no se puede actualizar. Se puede crear una tupla mutable y luego escriba el resultado de la función de intercambio si quieres:
let mutable toto = 5, 10
let swap (x, y) = y, x
toto <- swap toto
Mi consejo sería investigar el lado inmutable de F #, mirar las formas que puede utilizar las estructuras inmutables para lograr lo que previamente habría hecho uso de valores mutables.
Rob
F # tiene "por referencia" parámetros simplemente como C #, por lo que puede escribir una función de intercambio clásica parecida:
let swap (x: byref<'a>) (y: byref<'a>) =
let temp = x
x <- y
y <- temp
let mutable x,y = 1,2
swap &x &y
Para ampliar la respuesta de Robert:
let swap (x : int, y : int) = y, x
let mutable x = 5
let mutable y = 10
let mutable xy = x, y
xy <- swap xy
hace que tanto las variables y la tupla mutable.