【问题标题】:F# matching expression and 'as' patternF# 匹配表达式和“as”模式
【发布时间】:2017-06-28 15:34:32
【问题描述】:

我正在研究一些 F# 并尝试实现像 this tutorial 中的解析器组合器;在对建议的解决方案进行了一些复制和粘贴之后,我尝试自己定制它。

我确实错过了一些东西,但编译器给了我一个奇怪的错误消息。

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)

上面的代码是我发现的问题的概括:在最后一个结果中通知错误(最里面匹配表达式的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'

但如果我不使用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)

那么编译器又高兴了。

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

【问题讨论】:

    标签: f# pattern-matching


    【解决方案1】:

    A s as x -> x
    

    x 的类型为T&lt;'a&gt;,而foo 所需的返回类型为T&lt;('a * 'a)&gt;。即使A case 不包含'a 的任何值,它也没有像forall 'a . T&lt;'a&gt; 这样的多态类型。在您的第二个示例中,您正在创建一个新的 A 实例,它可以具有所需的类型。

    【讨论】:

    • 好的,现在我明白我的错误了:我忘记了AT 类型的构造函数,而不是类型本身,因此x 不是T&lt;'a * 'b&gt; 类型。谢谢!
    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 2020-04-29
    • 1970-01-01
    相关资源
    最近更新 更多