не могу определить новую переменную для хранения моего списка - PullRequest
0 голосов
/ 22 марта 2020

Я изучаю императивное программирование в Ocaml, и у меня возникает следующая ситуация, когда я пытаюсь перевернуть связанный список:

это мои два определенных типа:

type cell = { data : int; next : rlist; }
and rlist = cell option ref

и вот моя обратная функция:

let reverse (head:rlist) = 
  let rec helper ((head: rlist),(tmp: rlist)) = 
    match !head with 
    | None -> tmp 
    | Some c when !(c.next) = None ->
        c.next := !tmp ; tmp := Some c ; tmp
    | Some c ->
        let a = ref Some !(c.next) ;
        c.next := !tmp ;
        tmp := Some c ;
        helper (a,tmp) 
  in
  helper (head, ref None)

эта версия выдаст мне синтаксическую ошибку, но если я заменю: let a = ref Some !(c.next) на head := !(c.next), она будет работать. Поэтому что-то не так с объявлением моего let.

1 Ответ

2 голосов
/ 23 марта 2020

Это выражение:

ref Some !(c.next)

анализируется следующим образом:

(ref Some) !(c.next)

по сути, потому что приложение функции в OCaml имеет очень высокий приоритет.

Вы должны заключить в скобки как this:

ref (Some !(c.next))

После исправления этой проблемы у вас есть другая проблема синтаксиса. Это выражение:

let a = ref (Some !(c.next));

недопустимо. Вам нужно иметь in после let. Краткое описание состоит в том, что внутри функции let используется для введения локальной переменной, а выражение, использующее локальную переменную, появляется после in. in требуется. Это можно исправить, изменив ; в конце на in.

После исправления этих двух проблем с синтаксисом у вас есть по крайней мере одна ошибка типа. Но я надеюсь, что это поможет вам добиться прогресса.

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