2015-12-29 3 views
0

Извините за немой вопрос, но я немного озадачен.
Как повторить TryParse до успеха в F #?

В C# я могу идиоматический сделать следующее:

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

В F # У меня есть два варианта Try 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'. –

 Смежные вопросы

  • Нет связанных вопросов^_^