如何部分应用活动模式

RMi*_*330 1 f# active-pattern

NuGetFsharpx.Extras包公开了用于正则表达式匹配的活动模式,限定为Fsharpx.Text.Regex.Match.

第一个参数是 BCL 中的 RegexOptions 值。

而不必写:

let someFunc =
    | Match RegexOptions.None "...pattern 1..." matches -> ...
    | Match RegexOptions.None "...pattern 2..." matches -> ...
    | Match RegexOptions.None "...pattern 3..." matches -> ...
    ...
Run Code Online (Sandbox Code Playgroud)

希望可以改为(使用修改后的Match'活动模式):

let someFunc =
    | Match' "...pattern 1..." matches -> ...
    | Match' "...pattern 2..." matches -> ...
    | Match' "...pattern 3..." matches -> ...
    ...
Run Code Online (Sandbox Code Playgroud)

Match'我想出的一种可能的定义是:

let (|Match'|_|) pattern =
    function
    | Match RegexOptions.None pattern matches -> Some matches
    | _ -> None
Run Code Online (Sandbox Code Playgroud)

...效果很好。然而,我忍不住想知道是否还有另一种类似于部分应用函数的方法,例如:

let (|Match'|_|) =
    Match RegexOptions.None
Run Code Online (Sandbox Code Playgroud)

令人沮丧的是,这是抱怨Type has no accessible object constructors.

类似于后一种(虽然失败)的方法是否可能?

Jim*_*oye 5

打开 Regex 模块,然后将最后一个示例更改为

let (|Match|_|) = (|Match|_|) RegexOptions.None
Run Code Online (Sandbox Code Playgroud)

事实上,如果您查看源代码,您会在 Compiled 模块中看到这样的示例。

https://github.com/fsprojects/FSharpx.Extras/blob/master/src/FSharpx.Extras/Regex.fs