让我们说我要用以下内容阅读用户的输入:
let input = Console.ReadLine()
我如何验证用户的输入以使其必须是整数,否则会显示错误消息?
答案 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)解析输入的情况下的函数组成更大的程序。
答案 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