匹配非详尽的失败

时间:2013-12-03 16:41:03

标签: sml smlnj

我无法弄清楚我在这里失踪的是哪种情况,对于我的功能,有人可以帮我找到哪种情况也要考虑,这样我就不会得到比赛非详尽的错误。我需要时间来真正想到缺少哪一部分。

fun eval_1 (nil,_) = nil
  | eval_1 (_,nil)  = nil 
  |eval_1 ((x::h::xs),(y::t::ys)) = if x = ~1 then (h,t)::eval_1(xs,ys) else(x,y)::eval_1(h::xs,t::ys);

fun eval_2 (nil,_) = nil
  | eval_2 (x,nil) = nil 
  |eval_2 ((x),(y::ys)) = eval_1 (x,y)::eval_2(x,ys);

 fun eval_3 (nil,_) = nil
   | eval_3 ((x::nil),nil) = nil 
   | eval_3 ((x::xs),(ys)) = eval_2(x,ys)::eval_3(xs,ys);

1 个答案:

答案 0 :(得分:2)

匹配(x:xs, y:ys)代替((x::h::xs),(y::t::ys))摆脱了非详尽的警告。要使代码的其余部分等效,您可以使用hd中的tlList来获取尾部的尾部和尾部的尾部,而不是使用{{1来分解列表}}

x::next::xs

示例运行:

fun eval_1 (nil,_) = nil
  | eval_1 (_,nil) = nil 
  | eval_1 (x::xs, y::ys) =  if x = ~1 then (hd xs, hd ys)::eval_1(tl xs, tl ys) else (x,y) :: eval_1(xs, ys)

fun eval_2 (nil,_) = nil
  | eval_2 (x,nil) = nil 
  | eval_2 ((x),(y::ys)) = eval_1 (x,y)::eval_2(x,ys);

fun eval_3 (nil,_) = nil
  | eval_3 ((x::nil),nil) = nil 
  | eval_3 ((x::xs),(ys)) = eval_2(x,ys)::eval_3(xs,ys);