如何在 F# 中验证 null 或空 space 输入
How to validate null or empty space input in F#
我正在尝试验证字符串输入以防止它为 null 或空。我尝试使用模式匹配,但无论输入如何,它总是打印错误。我觉得我必须添加另一个模式来表示所有其他输入,但我不知道怎么写。
let qwe = ""
let validate x =
match x with
| qwe -> printfn "error"
printf "Enter your pet's name: "
let petname = Console.ReadLine()
validate petname
我曾尝试使用 String.IsNullOrEmpty
,但遇到了更多问题。如果可能的话,您能否参考一些资源,我可以在这些资源中阅读有关此问题或 F# 中一般验证的信息。
如果要匹配空字符串或 null
,则必须使用文字值:
let validate x =
match x with
| null -> "null string"
| "" -> "empty string"
| _ -> "something else"
您上面的代码正在创建第二个名为 qwe
的值,它绑定到 x
具有的任何值。这就是它总是打印“错误”的原因。
要添加到已接受的答案中,您还可以将 String.IsNullOrEmpty
与 when
子句一起使用:
let validate x =
match x with
| s when String.IsNullOrEmpty s -> "error"
| s -> s
模式匹配在不同语言中的工作方式不同。例如,在 Erlang 中,它的工作原理是 if 找到具有相同名称的变量,然后如果要匹配的值等于变量中的值,则匹配将成功。如果未找到变量,则匹配将始终成功:
// test code in http://tpcg.io/NTA1YF
-module(helloworld).
-export([start/0]).
start() ->
Empty = "",
Null = nil,
Input = "zxc", % you can change this string to write different outputs
Output = case Input of
Empty -> "Empty string\n";
Null -> "Null\n";
X -> io_lib:format("Input is: ~p\n", [X])
end,
io:fwrite(Output).
但 F# 有 different behavior 并且几乎总是匹配变量成功(规则一致,但复杂)。
我认为最好的方法是使用 active patterns,因为它们是扩展模式匹配的清晰且可组合的方法:
open System
let inline (|NullOrEmpty|_|) s =
if String.IsNullOrEmpty s then
Some()
else
None
let validate x =
match x with
| NullOrEmpty -> failwith "null or empty string"
| _ -> ()
printf "Enter your pet's name: "
let petname = Console.ReadLine()
validate petname
我正在尝试验证字符串输入以防止它为 null 或空。我尝试使用模式匹配,但无论输入如何,它总是打印错误。我觉得我必须添加另一个模式来表示所有其他输入,但我不知道怎么写。
let qwe = ""
let validate x =
match x with
| qwe -> printfn "error"
printf "Enter your pet's name: "
let petname = Console.ReadLine()
validate petname
我曾尝试使用 String.IsNullOrEmpty
,但遇到了更多问题。如果可能的话,您能否参考一些资源,我可以在这些资源中阅读有关此问题或 F# 中一般验证的信息。
如果要匹配空字符串或 null
,则必须使用文字值:
let validate x =
match x with
| null -> "null string"
| "" -> "empty string"
| _ -> "something else"
您上面的代码正在创建第二个名为 qwe
的值,它绑定到 x
具有的任何值。这就是它总是打印“错误”的原因。
要添加到已接受的答案中,您还可以将 String.IsNullOrEmpty
与 when
子句一起使用:
let validate x =
match x with
| s when String.IsNullOrEmpty s -> "error"
| s -> s
模式匹配在不同语言中的工作方式不同。例如,在 Erlang 中,它的工作原理是 if 找到具有相同名称的变量,然后如果要匹配的值等于变量中的值,则匹配将成功。如果未找到变量,则匹配将始终成功:
// test code in http://tpcg.io/NTA1YF
-module(helloworld).
-export([start/0]).
start() ->
Empty = "",
Null = nil,
Input = "zxc", % you can change this string to write different outputs
Output = case Input of
Empty -> "Empty string\n";
Null -> "Null\n";
X -> io_lib:format("Input is: ~p\n", [X])
end,
io:fwrite(Output).
但 F# 有 different behavior 并且几乎总是匹配变量成功(规则一致,但复杂)。
我认为最好的方法是使用 active patterns,因为它们是扩展模式匹配的清晰且可组合的方法:
open System
let inline (|NullOrEmpty|_|) s =
if String.IsNullOrEmpty s then
Some()
else
None
let validate x =
match x with
| NullOrEmpty -> failwith "null or empty string"
| _ -> ()
printf "Enter your pet's name: "
let petname = Console.ReadLine()
validate petname