我在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 :(得分:1)
如果您希望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])
答案 1 :(得分:0)
通常情况下,最一般的情况是最后一种情况,最具体的情况是最大情况。
如果您想让K = 0和xs = []返回ping_list,则第二种情况应该是这样
|ff (_, 0, (x::[]), ping_list) = ping_list
您不需要命名arr,因为您没有使用它。如果要匹配xs = []
,则列表应为x :: []