Validation F#强制用户输入整数

Validation F#强制用户输入整数,validation,input,f#,Validation,Input,F#,假设我要用以下内容读入用户的输入: let input = Console.ReadLine() 如何验证用户的输入,使其必须为整数,否则将显示错误消息?请稍微展开@s952163的注释 您可以采用以下典型方式进行验证: let parse (s: string) = match (System.Int32.TryParse(s)) with | (true, value) -> value | (false, _) -> failwith "Invalid

假设我要用以下内容读入用户的输入:

let input = Console.ReadLine()

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

请稍微展开@s952163的注释

您可以采用以下典型方式进行验证:

let parse (s: string) =
    match (System.Int32.TryParse(s)) with
    | (true, value) -> value
    | (false, _) -> failwith "Invalid int"
请注意,此函数的返回类型为int,隐式返回类型为exception

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

let parse (s: string) =
    match (System.Int32.TryParse(s)) with
    | (true, value) ->  Ok value
    | (false, _) -> Error "Invalid int"
此函数具有返回类型的结果,这意味着所有输入都映射到显式输出

然后,当输入可以使用结果模块中的组合符(如map和bind)进行解析时,更大的程序可以由只使用案例的函数组成


我更喜欢使用活动模式来处理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

您可以使用
Int32.TryParse
对输入进行模式匹配。