Добро пожаловать в F #!
Вот рабочая программа;пояснение приведено ниже.
open System
let main() =
let answer = (new Random()).Next(1, 100)
printfn "Guess the number between 1 and 100"
let rec dummyWhileTrue(tries) =
let v = Console.ReadLine()
if v = "q" then
printfn "you have quit"
0
else
printfn "blah"
let mutable n = 0
let b = Int32.TryParse(v, &n)
if b = false then
printfn "This is not a number"
dummyWhileTrue(tries)
elif n = answer then
printfn "Correct! You win!"
tries
elif n < answer then
printfn "Guess higher"
dummyWhileTrue(tries+1)
else // n>answer
printfn "Guess lower"
dummyWhileTrue(tries+1)
let tries = dummyWhileTrue(1)
printfn "You guess %d times" tries
printfn "Press enter to exit"
Console.ReadLine() |> ignore
main()
Несколько вещей ...
Если вы вызываете методы с несколькими аргументами (например, Random.Next
), используйте скобки вокруг аргументов (* 1009)*).
Вы, похоже, работали над рекурсивной функцией (dummyWhileTrue
), а не над циклом while;цикл while тоже сработает, но я оставил его на вашем месте.Обратите внимание, что в F # нет break
или continue
, поэтому вы должны быть немного более структурированы с материалом if
внутри.
Я изменил ваш Console.WriteLine
на printfn
чтобы показать, как вызывать его с аргументом.
Я показал способ вызова TryParse
, который больше всего похож на C #.Сначала объявите вашу переменную (сделайте ее изменяемой, поскольку TryParse
будет записывать в это местоположение), а затем используйте &n
в качестве аргумента (в этом контексте &n
походит на ref n
или out n
в C #),В качестве альтернативы, в F # вы можете сделать так:
let b, n = Int32.TryParse(v)
, где F # позволяет вам опустить trailing-out-параметры и вместо этого возвращает их значение в конце кортежа;это всего лишь синтаксическое удобство.
Console.ReadLine
возвращает строку, которая вам не нужна в конце программы, поэтому передайте ее в функцию ignore
, чтобы сбросить значение (и получитьизбавиться от предупреждения о неиспользованном строковом значении).