【问题标题】:Pattern matching conflict模式匹配冲突
【发布时间】:2019-04-18 19:44:14
【问题描述】:

我在 sml 程序中遇到了模式匹配问题。我的代码是这样的:

fun ff (arr, _, [], _) = []
   |ff (arr, 0, (x::xs), ping_list) =ping_list
   |ff (arr, K, (x :: xs), ping_list) =
        (if Array.sub(arr, x)-1 < 1
        then ff(arr, (K-1), xs, (ping_list@[x]))
        else ff(arr, K, xs, (ping_list@[x])))

正如您在完成模式匹配的第三种情况后所见,K 可能为 0,而第三个参数列表可能为 []。在这种情况下,在运行一些测试后,它会选择第一个模式并返回[]。

我该如何控制这个?在 K=0 和 xs 都为空的情况下,我希望执行第二个模式并 ping_list 作为结果,但我也想了解如何处理这样的极端情况由 sml.

提前谢谢你

【问题讨论】:

    标签: sml


    【解决方案1】:

    您通常将最通用的情况作为最后一种情况,将最具体的情况作为顶部情况。

    如果您想让 K=0 和 xs=[] 返回 ping_list,您的第二种情况应该如下所示

    |ff (_, 0, (x::[]), ping_list) = ping_list
    

    你不需要命名 arr,因为你不使用它。如果你想匹配 xs = []

    ,列表应该是 x::[]

    【讨论】:

      【解决方案2】:

      如果您希望0[] 的定义与0x::xs 的定义相同,则可以将它们折叠为0 和任何列表的一种情况。

      但是你需要把那个子句放在前面,以避免匹配一般的空列表情况:

      fun ff (_, 0, _, ping_list) = ping_list
        | ff (_, _, [], _) = []
        | ff (arr, K, x::xs, ping_list) =
              if Array.sub(arr, x)-1 < 1
              then ff(arr, K-1, xs, ping_list@[x])
              else ff(arr, K, xs, ping_list@[x])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-23
        • 2016-01-04
        • 1970-01-01
        相关资源
        最近更新 更多