如何在 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.IsNullOrEmptywhen 子句一起使用:

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