为什么在模式匹配时出现语法错误

时间:2019-04-23 18:00:52

标签: ocaml

我必须创建一个函数,该函数将list列表并返回第一个和最后一个元素对的列表,第二个和第二个倒数第二个,依此类推列表是否具有偶数或奇数个元素都没有关系,因为奇怪的是,我只是忽略了中间元素。我的想法是,使一个新的rec有趣,它将旧列表及其反转作为输入,我想我已经完成了代码,但是我收到了;;

的语法错误。
let lip l =
    if [] then [] 
    else let l1=l l2=List.rev l in 
         let rec lp l1 l2 = match l1,l2 with 
        | [],[] ->[]
        | [],h2::t2->[]
        | h1::_,h2::_ -> 
        if (List.length l -2) >= 0 then [(h1,h2)]@ lp(List.tl l1) t2
        else [] ;;

2 个答案:

答案 0 :(得分:1)

您的代码中有很多错误。

我认为您看到的具体错误是由于in之后没有let rec lp ...造成的。

每个不在模块顶层的let后面都必须跟随in。一种考虑方式是,它是声明要在in之后出现的表达式中使用的局部变量的一种方式。但是您需要拥有in expr

另一种看待它的方法是定义一个名为lp的函数,但没有在任何地方调用它。

正如@ lambda.xy.x所指出的,您不能说if [] then ...,因为[]的类型不是bool。而且您不能说let x = e1 y = e2 in ...。正确的格式是let x = e1 in let y = e2 in ...

(或者您可以编写let x, y = e1, e2 in ...,将两个相似的变量定义为两个相似的值看起来更好。)

答案 1 :(得分:0)

以下代码至少应编译:

let lip list1 =
  if list1 = [] then []
  else
    let list2=List.rev list1 in 
    let rec lp l1 l2 = match l1,l2 with 
      | [], [] ->[]
      | [], _::_->[]
      | h1::_::_, h2::t2 -> (* l1 length >= 2*)
        (h1,h2) :: lp(List.tl l1) t2
      | h1::_,h2::t2 ->     (* l1 length = 1 *)
        []
    in
    []

我进行了以下更改:

  • 重命名了lip的自变量以使其与lp的自变量不同
  • 删除了别名let l1 = l
  • 将if条件更改为boolean类型的术语-比较不多,所以我假设您正在检查list1
  • 通过两个头的模式匹配替换了列表长度条件
  • else路径是第二个匹配项-最好将其重写为| [h1, _] -> ...
  • lp的定义必须跟随lip的实际主体-为了进行编译,我们现在只返回[],但是您可能还需要其他内容

正如@Jeffrey Scofield所述,您没有在代码中使用lp。如果您添加了一条注释,说明您要实现的目标以及lp的预期作用,这可能会有所帮助。