gpt4 book ai didi

F# 打破复杂语句中的 while 循环

转载 作者:行者123 更新时间:2023-12-04 16:28:59 25 4
gpt4 key购买 nike

我有这样一个功能:

let ScanColors() =
for i in 1..54 do
let mutable c = Unchecked.defaultof<string>

if (i = 9) then
c <- "U - WHITE"
else
if (i <> 0 && i%9 = 0) then
MoveSensor(SensorPos.THIRD)
else
MoveSensor(
match ((i - (i/9)*9)%2 <> 0) with
| true -> SensorPos.SECOND
| false -> SensorPos.FIRST)

while (true) do
c <- ScanColor()
if (c = "ERR") then
CalibrateSensorPosition()
else
break
ResetSensorPosition()

在这个函数中,在 while声明,我不能使用 break,因为如你所知, break在 F# 中不使用。我正在寻找 break 的替代品,我看到了这个链接:

F# break from while loop

但老实说,我不确定这个解决方案是否适合我的问题。

最佳答案

遗憾的是 F# 不支持 break .有各种相当复杂的方法来处理这个问题(比如 this recent one 或我的 computation builder ),但是这些方法都有缺点并且会使您的代码相当复杂。

解决这个问题的一般方法是使用递归重写代码 - 这通常会编译为与您在 C# 中使用 break 编写的相同的 IL。和 continue .

所以,while代码段中的块可以编写为一个函数,该函数递归调用自身,直到结果不是“ERR”,然后返回 c :

let rec scanWhileErr () =     
let c = ScanColor()
if c = "ERR" then
CalibrateSensorPosition()
scanWhileErr()
else c

然后从主块调用这个函数:
if (i <> 0 && i%9 = 0) then 
MoveSensor(SensorPos.THIRD)
else
MoveSensor(if (i - (i/9)*9)%2 <> 0 then SensorPos.SECOND else SensorPos.FIRST)

c <- scanWhileErr ()
ResetSensorPosition()

另外,我还改了你的 match关于 bool 值变成普通 if - 当你只有两个 case 并且它们是 bool 值时,使用 match 真的没有意义在 if .

另外,我保留了您的可变变量 c ,但我怀疑由于递归,您不再需要它。

关于F# 打破复杂语句中的 while 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27755396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com