Ошибка типа компиляции OCaml, неправильный ожидаемый тип функции - PullRequest
0 голосов
/ 16 июня 2019

Новое в OCaml.

В основном пытаюсь скомпилировать кусок кода, в основном с двумя функциями, но я не могу скомпилировать его с ошибкой типа в строке 9, символы столбца 26-27, говоря:

"Ошибка: это выражение имеет тип t, но ожидалось выражение типа string" "

По сути, функция синтаксического анализа, вызываемая в строке 8, ожидает строку типа, но я не могу понять,почему.

Тип аргумента sexp:

type sexp = Atom of string | List of sexp list

код:

open Sexplib.Sexp

let rec parse_bindings bindings =
  match bindings with
    | [] -> []
    | first::rest ->
      match first with
        | List([Atom(name); e]) ->
          [(name, parse e)] @ (parse_bindings rest)

let rec parse sexp : expr =
  match sexp with
    | Atom(s) ->
      (* some code *)
    | List(sexps) ->
      match sexps with
        | (* some code *)
        | [Atom("let"); List(bindings_sexp); e2] ->
          let binding_expr = parse_bindings bindings in
            ELet(binding_expr, parse e2)
        | _ -> failwith "foo"

1 Ответ

1 голос
/ 16 июня 2019

Код, который вы даете, не будет компилироваться, потому что на parse есть ссылка в строке 9, но он не определен до более позднего времени.

Чтобы определить две взаимно рекурсивные функции, вам нужно использовать let rec ... and ...:

let rec f x = (* definition of f, which calls g *)
and g x = (* definition of g, which calls f *)

Поскольку более позднее определение parse не отображается в строке 9, имя должно ссылаться на какое-то предыдущее определение.Может быть, есть функция с именем parse, определенная в модуле Sexp.(Это одна из причин осторожного использования open.)

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