Compiler errors 多案例参数化活动模式返回错误FS0722只有恰好返回一个结果的活动模式才能接受参数

Compiler errors 多案例参数化活动模式返回错误FS0722只有恰好返回一个结果的活动模式才能接受参数,compiler-errors,f#,active-pattern,Compiler Errors,F#,Active Pattern,因为我只找到了关于这个错误的日语页面,我想,让我们在这里记录并询问一下,因为我的日语有点生疏了 如果我有以下FSharp活动模式(简化示例): 抛出:错误FS0722:只有恰好返回一个结果的活动模式才能接受参数 我可以通过将其转换为两个单例参数化活动模式来解决这个问题,每个模式都返回None/Some(x),但我仍然想知道为什么不允许我这样做和/或是否有我不知道的语法可以使用。我还想知道为什么它可以编译,但我不能使用它?最简单的解决方案是将其重构为: 注意,我冒昧地给这个模式起了一个更好的名字,

因为我只找到了关于这个错误的日语页面,我想,让我们在这里记录并询问一下,因为我的日语有点生疏了

如果我有以下FSharp活动模式(简化示例):

抛出:错误FS0722:只有恰好返回一个结果的活动模式才能接受参数


我可以通过将其转换为两个单例参数化活动模式来解决这个问题,每个模式都返回None/Some(x),但我仍然想知道为什么不允许我这样做和/或是否有我不知道的语法可以使用。我还想知道为什么它可以编译,但我不能使用它?

最简单的解决方案是将其重构为:

注意,我冒昧地给这个模式起了一个更好的名字,因为那些使用你的代码的人可能会对它的行为和角落案例感到困惑

我还在想为什么不允许我这么做


是的,这确实是合乎逻辑的做法(正如我在最后一段中简要提到的那样)。在实际使用该模式之前,我主要对它的编译感到惊讶。它编译到什么和/或是否可以使用编译的多案例活动模式,可能在模式匹配的上下文之外?PS:我之前没有找到链接的问题,因为我在谷歌上搜索了错误代码FS0722,链接的问题具有相同的错误描述,但是另一个代码。我没有检查到底生成了什么IL,但是链接的答案似乎是合乎逻辑的:非部分活动模式函数只调用一次,此时无法绑定参数。我已经编辑了链接Q,以便将来其他人可以找到它。
let (|InRange|OutOfRange|) from too =
    function
    | input when input >= from && input <= too -> InRange
    | _ -> OutOfRange
val ( |InRange|OutOfRange| ) :
  from:'a -> too:'a -> _arg1:'a -> Choice<unit,unit> when 'a : comparison
let test i = match i with
             | InRange 10 20 -> "in range"
             | _ -> "out of range"
let (|InRangeInclusive|_|) lo hi x =
    if lo <= x && x <= hi then Some () else None
let test i = match i with
         | InRangeInclusive 10 20 -> "in first range"
         | InRangeInclusive 42 100 -> "in second range"
         | _ -> "out of range"