我在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处理的。
先感谢您
如果你想要0
和[]
和0
和x::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])
通常情况下,最常见的情况是最后一种情况,最具体的情况是最佳情况。
如果你想让K = 0和xs = []来返回ping_list你的第二种情况应该是这样的
|ff (_, 0, (x::[]), ping_list) = ping_list
你不需要命名arr,因为你不使用它。如果你想匹配xs = [],列表应该是x :: []