F#匹配表达式和'as'模式

Atr*_*opo 7 f# pattern-matching

我正在研究一些F#并试图像本教程中那样实现一个解析器组合器; 在对提议的解决方案进行一些复制和粘贴之后,我尝试自己进行自定义.

当然有一些我错过了,但编译器给了我一个奇怪的错误信息.

type T<'a> =
    | A of string
    | B of 'a

let foo a b =
    match a with
    | A s as x -> x
    | B i ->
        match b with
        | A s as x -> x
        | B j ->
            B (i, j)
Run Code Online (Sandbox Code Playgroud)

上面的代码是我发现的问题的概括:在最后的结果(最里面的匹配表达式的B分支)中通知错误:

error FS0001: Type mismatch. Expecting a
    'a
but given a
    'a * 'b
The resulting type would be infinite when unifying ''a' and ''a * 'b'
Run Code Online (Sandbox Code Playgroud)

但如果我不使用该as模式:

let foo a b =
    match a with
    | A s -> A s // it can also be '| A s as x -> A s'
    | B i ->
        match b with
        | A s -> A s
        | B j ->
            B (i, j)
Run Code Online (Sandbox Code Playgroud)

然后编译器再次开心.

我不明白为什么我必须重新创建相同的逻辑结果,如果它已经存在.

Lee*_*Lee 7

A s as x -> x
Run Code Online (Sandbox Code Playgroud)

x已键入T<'a>而所需的返回类型fooT<('a * 'a)>.即使A案例中不包含任何值,'a也不具有类似的多态类型forall 'a . T<'a>.在第二个示例中,您将创建一个A可以具有所需类型的新实例.