gpt4 book ai didi

F#:基本类型的模式匹配

转载 作者:行者123 更新时间:2023-12-04 10:37:07 25 4
gpt4 key购买 nike

我有一系列验证函数,我想放入一个数组中执行:

type result = {D: int; E: int; F: int; G: int}

type InvalidReason =
| AAA
| BBB
| CCC
| DDD
| EEE

type Validation =
| Valid
| Invalid of InvalidReason

let validators = [|AAA; BBB; CCC; DDD; EEE|]

let validateStuff result =
validators
|> Array.map(fun v -> v result)
|> Array.contains(Validation.Invalid _)

问题是最后一行代码。我收到“表达式中的意外值 _”。以下确实有效

|> Array.contains(Validation.Valid)
|> Array.contains(Validation.Invalid InvalidReason.AAA)

但我不想详细说明 InvalidReasons 的每个子类型。有没有我忽略的语法?

最佳答案

Array.contains 函数获取一个值并检查该值是否在数组中。你要做的是给它一大堆值来检查。好吧,这行不通:函数只需要一个。 F# 中没有这样的语法也无济于事:-)

您可能会使用另一个接受多个值的函数,但实现您想要的更好的方法是使用接受谓词的函数 - Array.exists .让自己成为一个谓词来检查一个值是否“无效”:

let isInvalid x = match x with
| Valid -> false
| Invalid _ -> true

并将其传递给 Array.exists:

let validateStuff result = 
validators
|> Array.map(fun v -> v result)
|> Array.exists isInvalid

或者您甚至可以将该函数内联:

let validateStuff result = 
validators
|> Array.map(fun v -> v result)
|> Array.exists ( fun x -> match x with
| Valid -> false
| Invalid _ -> true )

或者更短,使用 function 关键字:

let validateStuff result = 
validators
|> Array.map(fun v -> v result)
|> Array.exists ( function | Valid -> false | Invalid _ -> true )

或者更短,尽可能多地消除噪音:

let validateStuff result = 
validators
|> Array.map(fun v -> v result)
|> Array.exists ( function Invalid _ -> true | _ -> false )

关于F#:基本类型的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50193363/

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