F#:基类型上的模式匹配
我想将一系列验证函数放入数组中执行:F#:基类型上的模式匹配,f#,F#,我想将一系列验证函数放入数组中执行: 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 =
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)
但我不想详细说明残疾儿童的每一个子类型。是否有我忽略的语法?函数
Array.contains
获取一个值并检查该值是否在数组中。你要做的是给它一大堆的值来检查。好吧,这是行不通的:函数只需要一个。在F#:-)中没有这样的语法也无济于事
您可能会使用另一个接受多个值的函数,但更好的方法是使用接受谓词-。使自己成为检查值是否“无效”的谓词:
并将其传递给数组。存在:
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 )
甚至更短,使用函数
关键字:
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 )
let validateStuff result =
validators
|> Array.map(fun v -> v result)
|> Array.exists ( function Invalid _ -> true | _ -> false )