【问题标题】:Match non exhaustive in sml匹配非详尽的 sml
【发布时间】:2016-10-06 16:33:41
【问题描述】:
fun p( x::xl ) =
  if x::xl = [] then []
  else [0];

收到警告:匹配非详尽。

x::xl => ...

我想做的是:

p( [] ) = []

当我这样做时,它会给出一个未捕获的异常 Match [nonexhaustive match failure]

【问题讨论】:

    标签: sml smlnj ml


    【解决方案1】:

    x::xl = [] 你测试的东西永远不会是真的。列表是代数类型,定义为

    datatype 'a list = :: of 'a * 'a list
                     | []
    

    表示作为列表的值是或者空列表放在另一个列表前面的某个元素。

    所以一旦你对x::xl 的初始模式匹配成功,你就知道它不是空的。 (不过,这应该很清楚,因为如果 x::xl 为空,它将分配给 x 什么;空列表的第一个元素?)

    您似乎在这里混合了两种样式,一种是模式匹配,另一种是 if-then-else

    fun p [] = []
      | p (_::_) = [0]
    
    fun p xs = if List.null xs then [] else [0]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      • 1970-01-01
      相关资源
      最近更新 更多