Как вы возвращаете несколько значений и присваиваете их переменным переменным? - PullRequest
11 голосов
/ 04 июня 2009

Это то, что я имею до сих пор.

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)

Ответы [ 4 ]

11 голосов
/ 04 июня 2009

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

let newX, newY = Swap(x,y)
x <- newX
y <- newY
3 голосов
/ 04 апреля 2011

F # имеет параметры «по ссылке» так же, как C #, поэтому вы можете написать классическую функцию подкачки аналогично:

let swap (x: byref<'a>) (y: byref<'a>) =
    let temp = x
    x <- y
    y <- temp

let mutable x,y = 1,2
swap &x &y
3 голосов
/ 04 июня 2009

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

let mutable toto = 5, 10 

let swap (x, y) = y, x

toto  <- swap toto

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

Rob

0 голосов
/ 04 июня 2009

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

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

xy <- swap xy

Делает переменные и кортеж изменяемыми.

...