Синтаксическая ошибка с взаимной рекурсией в списке в OCaml - PullRequest
0 голосов
/ 17 мая 2018

Я использую 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 throwsсинтаксическая ошибка на ;;в самом конце кода.Я не уверен, с чего начать, чтобы выяснить, что это за ошибка на самом деле.

1 Ответ

0 голосов
/ 17 мая 2018

Я подозреваю, что вы забыли добавить 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)
  <b>in
  add list</b>

Это запустит последовательность с +, т.е. 1 + 2 - 3 ...

Если вы хотите, чтобы он начинался с - ...

...
in
<b>sub</b> 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...