2009-06-03 25 views
5

klasik takas fonksiyonudur:F #: Klasik takas işlevi nasıl yazılır? C# '

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); 

nasıl yazacağını F # ile?

(Not, ben işlevsel eşdeğerini istemiyorum ben aslında referans semantik geçmek gerekir..)

+1

bir demet içinde iki değerin sırasını değiştiren bir fonksiyon? – crashmstr

+1

Gerçekten önemli mi? Soru bir soru ... hala bir cevabı hak ediyor. – jrista

+2

F # bir ada değil. Bu durumda, büyük ölçüde çıkış parametrelerine dayanan SQL saklı yordamlar için sarmalayıcılar üzerinde çalışıyorum. İşlev stili API'si ve sql stili API arasında oturmak için buna ihtiyacım var. –

cevap

9

Jared'in kodu aşağıdaki

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

Örnek deneyin:

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 

Normalde, mutable let'in yerine ref-cells kullanırsınız.

+0

Bundan emin misin? Mümkün olduğunda mutantların tercih edilmesini gerektiğini okudum. –

1

/// işlevin versiyonunu istemiyorsanız, o zaman neden F # kullanmak

let Swap (a, b) = (b, a) 
+0

Bu soru tuple'larda değişmekle ilgili değil, 'temp = a; a <-b; b <-temp' gibi bir şeyle ilgili. –