2016-09-10 7 views
2

Итак, я пытаюсь сделать простую факториальную функцию в F #, которая использует значение, введенное пользователем (с помощью консоли я не знаю, делает ли это любая разница), но я не могу найти какое-либо решение, чтобы иметь возможность использовать значение от пользователя в моей функции.Как я могу использовать введенное пользователем значение в моей функции в F #

open System 

    let rec fact x = 
     if x < 1 then 1 
     else x * fact (x - 1) 

    let input = Console.ReadLine() 
    Console.WriteLine(fact input) 

Он постоянно дает мне ошибку говоря «Это выражение, как ожидается, имеют тип„ИНТ“, но здесь имеет тип„строка“». Если кто-нибудь имеет представление о том, как заставить его работать должным образом (или, по крайней мере, может сказать мне, что мне нужно сделать, чтобы преобразовать введенное пользователем значение в INT, это было бы весьма полезно.

Благодарим за любую помощь.

ответ

3

F # не делает никакого автоматического преобразования для вас, так что вам нужно разобрать строку:

open System 

let rec fact x = 
    if x < 1 then 1 
    else x * fact (x - 1) 

let input = Console.ReadLine() 
Console.WriteLine(fact (Int32.Parse input)) 

в теории вы должны преобразовать обратно в строку, чтобы напечатать ее, но она работает, потому что есть перегрузка для Console.WriteLine, которая принимает целое число и делает преобразование.

+0

Будет ли это не взорвать во время выполнения? Также как 'somevalue |> int'. Это будет противоречить F # компиляции безопасности, чтобы рассказать вам об опасностях во время компиляции вместо того, чтобы позволить вашему приложению взорваться во время выполнения. – HMR

+1

@ HMR Конечно, он будет дуть во время выполнения, я не рекомендую использовать этот код в производстве или давать советы по лучшим практикам, просто отвечая на вопрос. Для производственного кода лучшим способом было бы использовать функции '' tryParse'', но для этого требуется понимание того, как с этим бороться, и это, похоже, вопрос новичков. – Gustavo

0

Так как:

somevalue |> int 

и

System.Int32.Parse somevalue 

сгенерирует исключение при некорректном вводе не лучше, чтобы предотвратить приложение от взрыва во время выполнения?

Поскольку я не мог найти какую-либо функцию, которая возвращает int option я написал одно:

let asInt32 numberString = 
    let (success,num) = 
    System.Int32.TryParse(numberString) 
    if success then 
    Some num 
    else 
    None 
asInt32 "22" 

(с использованием TryParse как предложено Gustavo)

+1

Вы должны использовать '' System.Int32.TryParse'', а затем преобразовать в '' int option''. – Gustavo