由于我只找到了关于这个错误的日语页面,我想,既然我的日语有点生疏,我们就记录下来并在这里询问。
如果我有以下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"
抛出:错误FS0722:只有返回一个结果的活动模式可以接受参数
我可以通过将其转换为两个单例参数化活动模式来解决它,每个模式返回None/Some(x),但我仍然想知道为什么我不允许这样做和/或是否有语法我可以使用,我不知道。我也想知道为什么它编译,但我不能使用它?
最简单的解决方案是将其重构为部分活动模式:
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"
注意,我冒昧地给这个模式起了一个更好的名字,因为那些使用你代码的人可能会对它的行为和极端情况感到困惑。
我仍然想知道为什么我不允许这样做?
为什么f#中不能参数化非局部活动模式?