首页 > 解决方案 > OCaml中列表上的相互递归的语法错误

问题描述

我正在使用 OCaml v 4.00.1。我正在尝试使用相互递归编写一个函数来获取一个列表并返回一个 int。int 是取列表的交替元素并将它们彼此相加和相减的结果。例如,列表 [1;2;3;4] 将导致 1 + 2 - 3 + 4 = 4。

我的代码如下:

let alt list =
  let rec add xs = match xs with 
    [] -> 0 
    | x::xs -> x + (sub xs)
  and sub xs = match xs with 
    [] -> 0
    | x::xs -> x - (add xs);;

OCaml 在 ;; 上引发语法错误 在代码的最后。我不确定从哪里开始弄清楚这个错误实际上是什么。

标签: ocaml

解决方案


我怀疑您忘记添加绑定in ...的一部分- 更改为粗体let

let alt list =
  let rec add xs =
    match xs with 
      | [] -> 0 
      | x::xs -> x + (sub xs)
  and sub xs =
    match xs with 
      | [] -> 0
      | x::xs -> x - (add xs)
  in
  add list

这将以 开始序列+,即 1 + 2 - 3 ...

如果你想让它开始-...

...
in
sub list

我们可以在这里交换match语法function并提高可读性

let alt list =
  let rec add = function
    | [] -> 0
    | x::xs -> x + (sub xs)
  and sub = function
    | [] -> 0
    | x::xs -> x - (add xs)
  in
  add list

推荐阅读