2015-12-29 51 views
0

對不起愚蠢的問題,但我有點困惑。
如何重複TryParse直到F#成功?

在C#中,我可以慣用做到以下幾點:

int result = 0; 
while (!Int32.TryParse(someString, out result)) 
{ 
    ... 
} 

在F#我有嘗試DoSomething的模式兩種選擇。
它要麼

let (isSuccess, result) = Int32.TryParse someString 

let result = ref 0 
let isSuccess = Int32.TryParse("23", result) 

我可以做while not Int32.TryParse("23", result) do ...,但不知道是否相同與第一方案可以實現的。

P.S.當然,尾遞歸也是可行這裏,但我感興趣的是使用while結構。

+1

我想你已經回答了你的問題:)你可以使用第二個變體與'而'或使用遞歸的第一個變種... –

回答

1

你可以這樣做:

while (not (fst (Int32.TryParse someString))) do 
    printfn "in while loop. It's not an Int32." ; 
    someString <- Console.ReadLine(); 

或者(如果你所關心的分析結果):

while 
    let (isSuccess, result) = Int32.TryParse someString in 
    not isSuccess do 
     printfn "in while loop. It's not an Int32 ; it is %A" result; 
     someString <- Console.ReadLine(); 
+0

讓內部,而...這太酷了,謝謝。 –

+0

如果你不需要,你也可以做的結果是:'Int32.TryParse「1」 |> FST |> not' – mydogisbox

+0

順便說一句,上面仍然例如需要在外部範圍可變變量,如果需要的結果'while'結束後。 –