【问题标题】:Why do i get syntax error at end problem with pattern matching为什么我在模式匹配的最后出现语法错误
【发布时间】:2019-04-23 18:00:51
【问题描述】:

我必须创建一个函数来获取列表并返回第一个和最后一个元素对的列表,第二个和第二个最后一个等等列表是否有偶数或奇数个元素都没有关系,因为如果它奇怪的是我会忽略中间元素。我的想法是制作一个新的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 [] ;;

【问题讨论】:

  • 一个问题肯定是if []——要么写if l = []要么match l with | [] -> [] | otherpattern -> somelist
  • let l1=l l2=List.rev l in 中的多个绑定也不起作用 -- ` let l1=l in let l2=List.rev l in. Not sure why you introduce l1` 作为 l 的别名. t2 也是一个未知变量——它应该是一个附加参数还是一个错字?
  • t2 受模式匹配的约束。它不是一个未定义的变量。
  • 啊,对了,刚刚看到了……只是在那个分支里不见了。
  • 哎呀——好点子!

标签: ocaml


【解决方案1】:

您的代码中有很多错误。

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

每个不在模块顶层的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 ...,这样看起来更适合将两个相似的变量定义为两个相似的值。)

【讨论】:

    【解决方案2】:

    以下代码至少应该可以编译:

    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 条件更改为布尔类型的术语 - 没有太多可比较的,所以我假设您正在检查 list1
    • 将列表长度条件替换为针对两个头部的模式匹配
    • else 路径是第二个匹配项 - 最好将其重写为 | [h1, _] -> ...
    • lp 的定义需要跟在 lip 的实际主体之后 - 为了使其编译,我们现在只返回 [],但您可能还想要其他内容

    正如@Jeffrey Scofield 已经提到的,您没有在代码中使用lp。如果您添加一条评论来解释您想要实现的目标以及lp 的预期角色是什么,这可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      • 1970-01-01
      相关资源
      最近更新 更多