在F中解析/键入as-patterns#
问题描述:
我正在尝试使用as-pattern来分解元组值,并观察一些奇怪的解析/键入行为。例如FSI(4.0)运行:在F中解析/键入as-patterns#
> let t = (0, (1, 2), 3) in let (_, (_, _) as pair, _) = t in();;
let t = (0, (1, 2), 3) in let (_, (_, _) as pair, _) = t in();;
-------------------------------------------------------^
stdin(9,56): error FS0001: Type mismatch. Expecting a
('a * ('b * 'c)) * 'd
but given a
int * (int * int) * int
The type ''a * ('b * 'c)' does not match the type 'int'
然而,例如工作,如果我把一些额外的():
> let t = (0, (1, 2), 3) in let (_, ((_, _) as pair), _) = t in();;
val it : unit =()
这是我稍微愚蠢,或者是解析器在第一失常例?我猜想它试图将“as pair”应用于“,(,_)”,这看起来稍微比看起来更加贪婪。
答
,
比as
更高的优先级,这就是为什么你需要额外的(
,)
在
> let t = (0, (1, 2), 3) in let (_, ((_, _) as pair), _) = t in pair;;
val it : int * int = (1, 2)
你可以从错误中看到这一点:
stdin(9,56): error FS0001: Type mismatch. Expecting a ('a * ('b * 'c)) * 'd but given a int * (int * int) * int
它会告诉你基本上是放错地方一些括号;)