绑定不是SML/NJ中的详尽警告,但不是F#中的相同模式的警告

  • 本文关键字:警告 模式 SML NJ 绑定 f# sml smlnj
  • 更新时间 :
  • 英文 :


下面的SML/NJ代码导致绑定不是针对";val Grove(whatTree(=峡谷;。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).

最新更新