gpt4 book ai didi

f# - 如何在F#中检查值是否为空

转载 作者:行者123 更新时间:2023-12-03 23:15:43 25 4
gpt4 key购买 nike

以此代码为例,如何检查输入是否为空?类似的代码抛出空引用异常

let private Method ( str:string) : string = 
let a = str
a.[a.Length-1]

最佳答案

虽然 isNull是一个 super 简单的答案并且完全有效,我认为与其他一些人一起玩会很有趣,因为 F# 很有趣 :)

首先让我们设置一个小函数来快速测试结果

open System

let test f a =
try
printfn "Input %A, output %A" a (f a)
printfn "Input %A, output %A" "" (f "")
printfn "Input %A, output %A" null (f null)
with
| :? Exception as ex -> printfn "%s" ex.Message

我们的第一个功能只是建立一个基线。
抛出异常
//string -> string
let getLast1 ( s:string) : string = s.[s.Length-1] |> string

printfn "=== getLast1 ==="
test getLast1 "bing"

=== getLast1 ===
Input "bing", output "g"
Index was outside the bounds of the array.



下一个使用 if 检查值如果不是有效值,则返回空字符串。
返回空字符串
//string -> string
let getLast2 ( s:string) : string =
if (String.IsNullOrEmpty s) then ""
else s.[s.Length-1] |> string

printfn "=== getLast2 ==="
test getLast2 "bing"

=== getLast2 ===
Input "bing", output "g"
Input "", output ""
Input , output ""



我们至少现在正在执行所有路径。

让我们尝试一种更实用的方法:
返回 option使用模式匹配
//string -> string option
let getLast3 (s:string) =
match s with
| null -> None
| _ ->
match (s.ToCharArray()) with
| [||] -> None
| [|x|] -> Some x
| xs -> Array.tryLast xs
|> Option.map string

printfn "=== getLast3 ==="
test getLast3 "bing"

=== getLast3 ===
Input "bing", output Some "g"
Input "", output <null> //note that <null> is actually None here.
Input <null>, output <null> //note that <null> is actually None here.



这有效,但它不是最容易阅读的功能。这还不错,但如果我们试图打破它呢。

组合函数
//'a -> 'a option
let sanitize x = if (isNull x) then None else Some(x)
//string -> char[]
let toCharArray (s:string) = s.ToCharArray()
//'a[] option -> 'a option
let last xs =
xs |> Option.map Array.tryLast //tryLast returns an 'a option
|> Option.flatten // turns 'a option option to a' option

现在我们有了构建块,我们可以构建新的最后一个函数:
//string -> string option
let getLast4 s =
s |> sanitize
|> Option.map toCharArray
|> last
|> Option.map string

printfn "=== getLast4 ==="
test getLast4 "bing"

=== getLast4 ===
Input "bing", output Some "g"
Input "", output <null> //note that <null> is actually None here.
Input , output <null> //note that <null> is actually None here.



说实话 getLast2可能没问题。如果我发现自己在检查空字符串,我宁愿返回 SomeNone来自 if .我只是想展示如何远离 null并使用内置 Array职能。

关于f# - 如何在F#中检查值是否为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51079733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com