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)
然后编译器再次开心.
我不明白为什么我必须重新创建相同的逻辑结果,如果它已经存在.
在
A s as x -> x
Run Code Online (Sandbox Code Playgroud)
x已键入T<'a>而所需的返回类型foo为T<('a * 'a)>.即使A案例中不包含任何值,'a也不具有类似的多态类型forall 'a . T<'a>.在第二个示例中,您将创建一个A可以具有所需类型的新实例.
| 归档时间: |
|
| 查看次数: |
121 次 |
| 最近记录: |