2009-06-03 111 views
10

這是我到目前爲止。如何返回多個值並將它們分配給可變變量?

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

我正在學習Python和想象f怎樣酷#可能是,如果我們允許:'A,B < - b,a`,`x。[a],x。[b] < - x [b],x [a]`這樣`swap`就不再需要了。 – colinfang 2013-09-30 11:55:47

回答

9

你不能;沒有語法可以用一個賦值來更新'多個可變變量'。當然,你可以做

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

我希望得到更好的答案,但至少這是一個正確的答案。嘆氣,F#的不一致正在迅速成爲我身邊的痛苦。我意識到我在推動邊界,但我不應該很快擊中他們。 – 2009-06-03 21:39:57

+4

我不確定我是否會將「語言邊界」定義爲不鼓勵語言構造的語法不如首選構造的語法。最好的做法也是最方便的,對我來說似乎是一個聰明的主意。 – 2009-06-03 21:57:37

+2

@Joel。這不就是邊界的定義嗎?如果我使用的是首選語法,我不會使用這個術語。 – 2009-06-07 06:37:20

2

您有評論,因爲當你寫「X,Y」創建一個新的元組是不可變的值不工作的代碼,因此無法更新。你可以創建一個可變的元組,然後,如果你想與交換功能的結果覆蓋它:

let mutable toto = 5, 10 

let swap (x, y) = y, x 

toto <- swap toto 

我的建議是,調查F#的不可變的一面,看看你可以使用一成不變的結構方式實現你以前使用可變值完成的工作。

羅布

0

爲了擴大對羅伯特的回答是:

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

xy <- swap xy 

使得無論是變量,元組可變的。

2

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 
相關問題