Ocaml 为什么这段代码不工作递归函数得到一个错误

Ocaml 为什么这段代码不工作递归函数得到一个错误,ocaml,Ocaml,我应该检查两个列表是否是字谜,我认为我为该任务编写了正确的代码,但这需要帮助 let rec ana l1 l2 = if l1=[] && l2=[] then true else if List.hd l1 = List.hd l2 then ana (List.tl l1) l2 else if List.hd l1 != List.hd l2 then ana l1 (List.tl l2) else false;; ana

我应该检查两个列表是否是字谜,我认为我为该任务编写了正确的代码,但这需要帮助

let rec ana l1 l2 = 
    if l1=[] && l2=[] then true
    else if List.hd l1 = List.hd l2 then  ana (List.tl l1) l2
    else if  List.hd l1 != List.hd l2 then ana l1 (List.tl l2)
    else false;; 

  ana [2;9;4;7] [2;4;7;9];;

您不会处理其中一个列表为空的情况,只有当两个列表都为空时。因此,当您进入
else if List.hd l1=List.hd l2
时,当
l1
l2
为空时,
List.hd
将引发异常,因为它不是为空列表定义的

您可能希望改用模式匹配,这样可以避免这种情况,并警告您任何遗漏的情况。下面是使用模式匹配重写的代码。它仍然不能满足您的要求,但至少不会引发异常:

let rec ana l1 l2 =
  match l1, l2 with
  | [], [] ->
    true

  | h1::t1, h2::t2 ->
    if h1 = h2 then
      ana t1 l2
    else
      ana l1 t2

  | _ ->
    false

嘿,没关系,欢迎来到SO!这不能回答您的问题,但我建议您不要使用!=因为不平等。它可能在整数上工作(在意外情况下),但在其他值上会有非常奇怪的行为。合适的不等式运算符是
。由于我们可能无法访问OCaml环境,并且并非都是MindReader,因此您可能还希望包含实际的错误消息。帮助我们帮助你,你知道吗?例外是faliure“hd”