模式匹配冲突

问题描述 投票:0回答:2

我在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
2个回答
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])

0
投票

通常情况下,最常见的情况是最后一种情况,最具体的情况是最佳情况。

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

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

你不需要命名arr,因为你不使用它。如果你想匹配xs = [],列表应该是x :: []

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.