F#强制用户输入整数

时间:2018-01-04 02:13:31

标签: validation input f#

让我们说我要用以下内容阅读用户的输入:

let input = Console.ReadLine()

我如何验证用户的输入以使其必须是整数,否则会显示错误消息?

2 个答案:

答案 0 :(得分:3)

稍微扩展@ s952163的评论。

你可以用这样的典型方式验证:

let parse (s: string) =
    match (System.Int32.TryParse(s)) with
    | (true, value) -> value
    | (false, _) -> failwith "Invalid int"

请注意,此函数的返回类型为int,也包含异常的隐式返回类型。

解析整数的更惯用的方法是纯函数:

let parse (s: string) =
    match (System.Int32.TryParse(s)) with
    | (true, value) ->  Ok value
    | (false, _) -> Error "Invalid int"

此函数的返回类型为Result,表示所有输入都映射到显式输出。

然后可以从仅使用结果模块中的组合器(如map和bind)解析输入的情况下的函数组成更大的程序。

enter image description here

答案 1 :(得分:1)

我更喜欢使用Active Patterns来处理F#中的解析。您可以为要解析的每种类型创建活动模式,例如:

let (|Int32|_|) (str: string) =
    match Int32.TryParse(str) with
    | (true, value) -> Some value
    | _ -> None

您可以为Int64,Bool,DateTime等创建类似的活动模式。然后,您可以这样使用它们:

match Console.ReadLine() with 
| Int32 i -> printfn "Integer: %d" i 
| invalid -> printfn "Error: %s is not an Integer" invalid