多案例参数化活动模式返回错误 FS0722 只有活动模式返回恰好一个结果可以接受参数
Multi-case parameterized active patterns returning error FS0722 Only active patterns returning exactly one result may accept arguments
因为我只找到关于这个错误的日文页面,所以我想,让我们记录下来并在这里询问,因为我的日语有点生疏。
如果我有以下 FSharp 活动模式(简化示例):
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"
Throws: error FS0722: Only active patterns returning exactly one result may accept arguments
我可以通过将它变成两个单例参数化活动模式来解决它,每个模式都返回 None/Some(x),但我仍然想知道为什么不允许我这样做 and/or是否有我不知道的可以使用的语法。我也想知道为什么它编译了,但是我不能使用它?
最简单的解决方案是将其重构为 partial active pattern:
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"
请注意,我冒昧地给该模式取了一个更好的名称,因为那些使用您的代码的人可能会对它的极端情况行为感到困惑。
I'm still wondering why I am not allowed doing so?
Why can't non-partial active patterns be parameterized in F#?
因为我只找到关于这个错误的日文页面,所以我想,让我们记录下来并在这里询问,因为我的日语有点生疏。
如果我有以下 FSharp 活动模式(简化示例):
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"
Throws: error FS0722: Only active patterns returning exactly one result may accept arguments
我可以通过将它变成两个单例参数化活动模式来解决它,每个模式都返回 None/Some(x),但我仍然想知道为什么不允许我这样做 and/or是否有我不知道的可以使用的语法。我也想知道为什么它编译了,但是我不能使用它?
最简单的解决方案是将其重构为 partial active pattern:
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"
请注意,我冒昧地给该模式取了一个更好的名称,因为那些使用您的代码的人可能会对它的极端情况行为感到困惑。
I'm still wondering why I am not allowed doing so?
Why can't non-partial active patterns be parameterized in F#?