为什么在模式匹配的最终问题上会出现语法错误

问题描述 投票:0回答:2

我必须创建一个函数,列表列表并返回第一个和最后一个元素,第二个和第二个元素对的列表,依此类推如果列表具有偶数或奇数个元素无关紧要,因为如果它的奇数我将只是忽略了中间元素。我的想法是创建一个新的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 [] ;;
ocaml
2个回答
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 ...,它看起来更好,可以将两个相似的变量定义为两个相似的值。)


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的预期作用,它可能会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.