F#基础类型模式匹配:验证函数数组执行编译报错排查
解决F#验证函数数组的执行错误问题
我来帮你搞定这个F#代码里的问题~咱们先拆解下你遇到的错误和代码里的小问题:
错误原因分析
你最后一行用Array.contains(Validation.Invalid _)报错,是因为Array.contains要求传入一个具体的Validation类型值,但Invalid _是F#的模式匹配语法,不是一个合法的参数值。你想要的是检查数组里是否存在任何Invalid类型的结果,这时候应该用Array.exists来实现,它可以接受一个函数来判断元素是否符合你要的模式。
另外还有个容易忽略的小问题:你的validators数组现在装的是InvalidReason类型的枚举值(AAA、BBB这些),但实际上你需要的是接收result并返回Validation的函数数组,不然v result这一步根本没法执行(总不能把枚举值当函数调用吧😅)。
修正后的完整代码
type result = {D: int; E: int; F: int; G: int} type InvalidReason = | AAA | BBB | CCC | DDD | EEE type Validation = | Valid | Invalid of InvalidReason // 先定义各个验证函数:每个函数接收result,返回Validation let validateD (r: result) = if r.D > 100 then Invalid AAA else Valid let validateE (r: result) = if r.E < 0 then Invalid BBB else Valid let validateF (r: result) = if r.F = 0 then Invalid CCC else Valid let validateG (r: result) = if r.G > r.D then Invalid DDD else Valid let validateTotal (r: result) = if r.D + r.E + r.F + r.G < 50 then Invalid EEE else Valid // 验证函数数组:现在每个元素都是合法的验证函数 let validators = [|validateD; validateE; validateF; validateG; validateTotal|] // 修正后的验证逻辑:用Array.exists检查是否存在Invalid结果 let validateStuff result = validators |> Array.map (fun validator -> validator result) // 执行每个验证函数,得到Validation数组 |> Array.exists (function // 检查数组里是否有任何Invalid元素 | Invalid _ -> true | Valid -> false)
关键修正点
- 替换
Array.contains为Array.exists:Array.exists会遍历数组,只要有一个元素满足匹配条件就返回true,完美契合你“只要有一个验证失败就返回无效”的需求。 - 修正
validators数组类型:把原来的InvalidReason枚举数组改成验证函数数组,这样每个元素都能接收result并返回Validation结果。
这样修改后,代码就能正常运行啦~
内容的提问来源于stack exchange,提问作者Jamie Dixon
相关产品推荐
相关产品推荐

