Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#:基类型上的模式匹配_F# - Fatal编程技术网

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 )