Почему я получаю синтаксическую ошибку в конце проблемы с сопоставлением с образцом - PullRequest
0 голосов
/ 23 апреля 2019

Я должен сделать функцию, которая принимает список списков и возвращает список пар первого и последнего элемента, второго и второго последнего и т. Д. Не имеет значения, имеет ли список четное или нечетное количество элементов, потому что если его странно, я просто проигнорирую средний элемент. Идея, которую я имею, состоит в том, чтобы сделать новую запись интересной, которая принимает старый список и его реверсы в качестве входных данных, я думаю, что я закончил код, но я получаю синтаксическую ошибку для ;;

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 ]

1 голос
/ 23 апреля 2019

В вашем коде довольно много ошибок.

Я думаю, что конкретная ошибка, которую вы видите, вызвана тем, что после let rec lp ....

* 1006 нет 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 ..., что выглядит лучше для определения двух одинаковых переменных для двух одинаковых значений.)

0 голосов
/ 23 апреля 2019

Следующий код должен как минимум скомпилироваться:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...