【问题标题】:Warning: match nonexhaustive警告:匹配不完整
【发布时间】:2014-09-18 20:29:50
【问题描述】:

我用我能想到的所有基本情况编写了一些 sml 代码,但是我仍然收到此警告。因此函数检查第一个列表是否是第二个列表的排列。我不确定它是否有效,尽管我认为它进入了无限循环!

fun isPermutation(nil: int list, nil: int list): bool = true
  | isPermutation(x::nil, nil) = false
  | isPermutation(nil, y::nil) = false
  | isPermutation(x1::nil, x2::nil) = if (x1=x2) then true else false
  | isPermutation(x1::l1, x2::l2) = isPermutation(x1::nil, x2::l2) andalso isPermutation(l1, x2::l2)

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    所以这些是你遇到的情况:

    (nil, nil)
    (x::nil, nil)
    (nil, y::nil)
    (x1::nil, x2::nil)
    (x1::l1, x2::l2)
    

    但是,如果 (x,y)([], [1,2,3]),则函数不匹配这些情况。这是因为在(x::nil, nil)(nil, y::nil) 行中,您假设如果其中一个参数是nil,则另一个应该是单例列表(仅包含一个元素的列表)。如果在这些情况下使用 (_, nil)(nil, _),您将覆盖其他可能的非单例列表,这将消除非详尽匹配警告。

    请注意_ 只是模式中的通配符,不会创建新的值绑定,因为您可以只使用xy 来访问通配符位置的元组元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 2019-12-02
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-04
      相关资源
      最近更新 更多