F#: Как написать классическую функцию подкачки?

В С# классическая функция подкачки:

void swap (ref int a, ref int b){
     int temp = a;
     a = b;
     b = temp;
}

int a = 5;
int b = 10;
swap( ref a, ref b);

Как бы я написал это на F#?

(Обратите внимание, мне не нужен функциональный эквивалент. Мне действительно нужна семантика передачи по ссылке.)


person Jonathan Allen    schedule 03.06.2009    source источник
comment
Если вам не нужна версия функции, то зачем использовать F#?   -  person crashmstr    schedule 03.06.2009
comment
Это действительно важно, почему? Вопрос есть вопрос... и все же заслуживает ответа.   -  person jrista    schedule 03.06.2009
comment
F# — это не остров. В этом случае я работаю над оболочками для хранимых процедур SQL, которые сильно зависят от выходных параметров. Мне нужно, чтобы это находилось между API-интерфейсом в стиле функций и API-интерфейсом в стиле sql.   -  person Jonathan Allen    schedule 03.06.2009
comment
Я думаю, что да. Вы можете дать лучший совет, если знаете, что человек пытается сделать.   -  person Jonathan Allen    schedule 03.06.2009
comment
@jrista правда, но иногда ответ зависит от контекста и мотивации. В данном случае мне просто было интересно.   -  person crashmstr    schedule 03.06.2009


Ответы (3)


Попробуйте следующее

let swap (left : 'a byref) (right : 'a byref) =
  let temp = left
  left <- right
  right <- temp
person JaredPar    schedule 03.06.2009

Пример кода Джареда:

let mutable (a, b) = (1, 2)

let swap (left : 'a byref) (right : 'a byref) =
  let temp = left
  left <- right
  right <- temp

printfn "a: %i - b: %i" a b
swap (&a) (&b)
printfn "a: %i - b: %i" a b

Обычно вы бы использовали ref-cells вместо mutable let's.

person Dario    schedule 03.06.2009
comment
Вы уверены, что. Я думал, что читал, что по возможности следует предпочитать изменчивые. - person Jonathan Allen; 03.06.2009

/// Функция, которая меняет порядок двух значений в кортеже

let Swap (a, b) = (b, a)
person Jugal Panchal    schedule 07.10.2013
comment
Этот вопрос не о замене кортежей, а о чем-то вроде let temp = a;a<-b;b<-temp - person John Palmer; 07.10.2013