【发布时间】: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