2009-06-03 11 views
10

Şimdiye dek sahip olduğum şey bu.Birden çok değeri nasıl döndürür ve bunları değişken değişkenlere nasıl atayabilirsiniz?

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) 
+0

Ben piton öğreniyorum ve biz izin verirse olabilir ne kadar soğuk F # düşünün: 'a, b <- b, a', x. [a], x. [b] <- x [b], x [a] 'Artık" takas "gerekmiyor. – colinfang

cevap

9

Yapamazsınız; Tek bir ödevle 'birden fazla değiştirilebilen değişken' güncellemek için bir sözdizimi yoktur. Tabii ki

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

Daha olumlu bir cevap vermeyi umuyordum, ama en azından bu doğru. Sigh, F # 'nin tutarsızlıkları hızla benim tarafımda bir acı oluyor. Sınırları aştığımı anlıyorum, ama yakında onlara vurmamalıyım. –

+4

İstenmeyen yapılardan daha az uygun sözdizimine sahip olduğu düşünülen dil yapılarının bir "sınır" olarak nitelendirileceğinden emin değilim. En iyi uygulamaları yapmak da en uygun olanı benim için akıllıca bir fikir gibi görünüyor. –

+2

@Joel. Bu sınır tanımı değil mi? Tercih edilen sözdizimini kullanıyor olsaydım, bu terimi kullanmazdım. –

2

Eğer yazarken "x, y" Bir değişmez bir değerdir yeni bir tuple yaratmak çünkü çalışmıyor yorumladı kod yapabilir, bu yüzden güncellenmiş edilemez. Bir değişken tuple yaratmak ve daha sonra isterseniz takas fonksiyonunun sonucu eskisinin üzerine yazma olabilir:

let mutable toto = 5, 10 

let swap (x, y) = y, x 

toto <- swap toto 

Benim tavsiyem kadar değişken yapılarını kullanma yollarına bakmak, F # değişmez tarafını araştırmak olacaktır Daha önce mutable değerleri kullanarak yapmış olabileceğiniz şeyi elde edin.

Rob

+0

Muhtemelen istediği budur –

+0

Bunu genellemek istiyorsanız, yine de mutable tuple'ı orijinal değerlere geri getirmeniz gerekir. Öyleyse gerçekten değişebilen bir tuple kullanmak bir israftır. –

+1

Niçin orijinal kutucukta yeni x ve y paketini açmanız veya değiştirmeniz gerektiği açık değil. Ben exmaple herhangi bir gerçek dünya, sadece "let x", y '= swap x y "yazacaksınız ve doğrudan x ve y prime kullanacaksınız. – Robert

0

Robert'ın yanıta genişletmek için:

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

xy <- swap xy 

değişkenler ve değişken başlığın hem yapar.

+0

Çalışmıyor. X ve y'yi yazdırdığınızda, değişmediklerini göreceksiniz. Xy mutable yapmak sadece bir kırmızı-ringa balığıydı, çünkü orijinal değişkenlerde kolayca geçebildiniz. –

+0

Doğru, x ve y güncelleştirilemiyor. –

2

F # sahiptir Eğer benzer bir klasik takas işlevi yazabilirsiniz böylece, sadece C# gibi parametreleri "referans olarak":

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

let mutable x,y = 1,2 
swap &x &y