模式匹配冲突

时间:2019-04-17 19:17:40

标签: sml

我在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。

提前谢谢

2 个答案:

答案 0 :(得分:1)

如果您希望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])

答案 1 :(得分:0)

通常情况下,最一般的情况是最后一种情况,最具体的情况是最大情况。

如果您想让K = 0和xs = []返回ping_list,则第二种情况应该是这样

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

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

,则列表应为x :: []