在 SML/NJ 中绑定非详尽警告,但在 F# 中不针对相同模式
Binding not exhaustive warning in SML/NJ but not in F# for same pattern
下面的 SML/NJ 代码导致对“val Grove(whatTree) = glen”的约束性非详尽警告。 F# 等效代码不产生警告。为什么?
新泽西州标准 ML(32 位)v110.99.2 [内置:2021 年 9 月 28 日星期二 13:04:14]:
datatype tree = Oak|Elem|Maple|Spruce|Fir|Pine|Willow
datatype vegetable = Carrot|Zucchini|Tomato|Cucumber|Lettuce
datatype grain = Wheat|Oat|Barley|Maize
datatype plot = Grove of tree|Garden of vegetable|Field of grain|Vacant
val glen = Grove(Oak)
val Grove(whatTree) = glen
F# 6.0.0 警告级别 5:
type Tree = Oak|Elem|Maple|Spruce|Fir|Pine|Willow
type Vegetable = Carrot|Zucchini|Tomato|Cucumber|Lettuce
type Grain = Wheat|Oat|Barley|Maize
type Plot = Grove of Tree|Garden of Vegetable|Field of Grain|Vacant
let glen = Grove(Oak)
let Grove(whatTree) = glen
这个相关问题的公认答案给了我一些关于我的问题的提示。 SML 警告表示冗余代码。所以,我假设 F# 编译器编写者认为这种情况不值得警告。
此 F# 代码 let Grove(whatTree) = glen
是有歧义的,因为它可以解释为具有解构或函数的值绑定。
第一种情况语法是
let pattern = expr
秒大小写语法为
let name pattern-list = expr
由于 F# 支持阴影,因此创建新函数是合法的。但SML似乎对此有不同意见,决定绑定价值。
最后:SML 和 F# 中的代码执行不同的操作,这就是没有警告的原因
要实际执行绑定,let
的左侧应加括号:
let (Grove(whatTree)) = glen
它产生警告:C:\stdin(6,5): warning FS0025: Incomplete pattern matches on this expression. For example, the value 'Field (_)' may indicate a case not covered by the pattern(s).
下面的 SML/NJ 代码导致对“val Grove(whatTree) = glen”的约束性非详尽警告。 F# 等效代码不产生警告。为什么?
新泽西州标准 ML(32 位)v110.99.2 [内置:2021 年 9 月 28 日星期二 13:04:14]:
datatype tree = Oak|Elem|Maple|Spruce|Fir|Pine|Willow
datatype vegetable = Carrot|Zucchini|Tomato|Cucumber|Lettuce
datatype grain = Wheat|Oat|Barley|Maize
datatype plot = Grove of tree|Garden of vegetable|Field of grain|Vacant
val glen = Grove(Oak)
val Grove(whatTree) = glen
F# 6.0.0 警告级别 5:
type Tree = Oak|Elem|Maple|Spruce|Fir|Pine|Willow
type Vegetable = Carrot|Zucchini|Tomato|Cucumber|Lettuce
type Grain = Wheat|Oat|Barley|Maize
type Plot = Grove of Tree|Garden of Vegetable|Field of Grain|Vacant
let glen = Grove(Oak)
let Grove(whatTree) = glen
此 F# 代码 let Grove(whatTree) = glen
是有歧义的,因为它可以解释为具有解构或函数的值绑定。
第一种情况语法是
let pattern = expr
秒大小写语法为
let name pattern-list = expr
由于 F# 支持阴影,因此创建新函数是合法的。但SML似乎对此有不同意见,决定绑定价值。
最后:SML 和 F# 中的代码执行不同的操作,这就是没有警告的原因
要实际执行绑定,let
的左侧应加括号:
let (Grove(whatTree)) = glen
它产生警告:C:\stdin(6,5): warning FS0025: Incomplete pattern matches on this expression. For example, the value 'Field (_)' may indicate a case not covered by the pattern(s).