SML匹配非穷尽警告问题:编写指定类型的列表空值判断函数
解决SML函数匹配不全面的警告问题
需求说明
- 编写函数
len:输入为空列表时返回0,否则返回1 - 函数类型必须为
val len = fn : (int * int * int) list list list list -> int
用户编写的代码
fun len[[[(x:(int*int*int)list)]]]= if null x then 0 else 1
警告信息(翻译后)
警告:匹配不全面
((x :: nil) :: nil) :: nil => ...
问题分析
你写的函数只匹配了四层列表中最内层恰好包含一个元素的特定结构,但四层列表的合法输入有很多种情况:比如最内层是空列表、最内层有多个元素,或者外层某一层是空列表/包含多个子列表等,这些情况都没有被你的函数覆盖,因此编译器抛出了匹配不全面的警告。
正确实现代码
要满足需求且消除警告,不需要嵌套匹配特定结构,直接判断整个输入的四层列表是否为空即可:
fun len lst = if null lst then 0 else 1
这个写法完全符合类型要求,同时覆盖了所有可能的输入情况,不会出现匹配警告。
内容的提问来源于stack exchange,提问作者SoRA
相关产品推荐
相关产品推荐

