F# 如何返回多个值并将其分配给可变变量?

F# 如何返回多个值并将其分配给可变变量?,f#,mutable,F#,Mutable,这就是我目前所拥有的 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) <- Swa

这就是我目前所拥有的

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)
let Swap(左:int,右:int)=(右,左)
设可变x=5
设可变y=10

让(newX,newY)=交换(x,y)/你不能;没有语法可以用单个赋值更新“多个可变变量”。你当然可以

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

x您注释的代码不起作用,因为当您编写“x,y”时,您创建了一个不可变值的新元组,因此无法更新。如果需要,可以创建可变元组,然后使用交换函数的结果覆盖它:

let mutable toto = 5, 10 

let swap (x, y) = y, x

toto  <- swap toto
设可变toto=5,10
让交换(x,y)=y,x
totoF#具有与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
let-swap(x:byref)=
设温度=x

这可能是你想要的如果你想推广它,你仍然必须把可变元组解压回原始值。因此,真正使用可变元组是一种浪费。我不清楚为什么需要解包甚至替换原始变量中的新x和y。我想在现实世界中,你只要写“让x,y'=交换xy”,然后直接使用x和y素数。@罗伯特,这不是关于使用idomatic F#。这是关于推动边缘并查看裂缝的位置。我从未在实际代码中使用过swap,但我仍然需要知道它是否可行,因为其他设计可能需要它。我想知道什么样的设计可能需要这种行为。我希望得到一个更有利的答案,但至少这是一个正确的答案。唉,F#的矛盾很快就成为我心中的痛。我意识到我在反对边界,但我不应该这么快就触及边界。我不确定我是否会将不受欢迎的语言结构的语法不如首选结构的概念描述为“边界”。对我来说,让最佳实践也最方便似乎是个聪明的主意。@Joel。这不是边界的定义吗?如果我使用的是首选语法,我就不会使用这个词了。@Brian,如果这个词在while循环中呢?尝试实现alphabeta搜索时遇到了这个问题……我正在学习python,想象一下如果我们允许:
a,b这段代码不能像编写的那样工作,
byref
必须在元组参数中使用,它们不能被转换。除此之外,这是一个很好的解决方案。