Это выражение имеет тип блока, но ожидалось выражение типа блока -> bool - PullRequest
0 голосов
/ 07 октября 2019

мое назначение (я написал это объяснение после вопроса и лучший ответ): я хотел вызвать каждый отдельный токен для функции в функции char со строкой чтения. Итак, я просто хотел сделать, это функция цикла, которая вызывает каждую другую функцию, которая управляет символом.


Я новичок в OCaml. Я пытаюсь вызвать функцию из анонимной функции. Но произошла ошибка при вызове функции в анонимной функции с ключевым словом function. Понятия не имею. Как заставить это работать в OCaml?

Вот код ошибки.

This expression has type unit but an expression was expected of type unit -> bool

Вот мой код noob с размещением ошибки, подчеркнутой ^^^.

let parseS () =
  false

let parseZ () =
  false

type parenType = Open_paren | Close_paren

let parseParen = function
  | (Open_paren)  -> ()
  | (Close_paren) -> ()

let read_input (str:string) () =
  let len = String.length str in
  let i = 0 in
  let rec read_token = function
    | (current, chr) when current >= len -> parseZ
    | (current, chr) when chr = 'S' -> parseS
    | (current, chr) when chr = 'Z' -> parseZ
    | (current, chr) when chr = '(' -> parseParen Open_paren
                                       ^^^^^^^^^^
    | (current, chr) when chr = ')' -> parseParen Close_paren
                                       ^^^^^^^^^^
    | _ -> raise @@ Invalid_argument "Error cause with token "
  in
  read_token (i + 1, str . [i + 1]) ;;

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

Вот мой ход пробного кода на данный момент о func read_input. read_input возвращает тот же тип, что и при вызове другой функции и после анонимной функции.

let read_input (str:string) =
  let len = String.length str in
  for i = 0 to len - 1 do
    match str . [i] with
    | 'S' -> parseS ()
    | 'Z' -> parseZ ()
    | '(' -> parseParen Open_paren
    | ')' -> parseParen Close_paren
    | _ -> ()
  done
0 голосов
/ 07 октября 2019

Ваши функции parseZ и parseS обе имеют тип unit -> bool. Выражение parseParen Open_paren имеет тип unit. Поскольку вы поместили и parseZ, и parseParen Open_paren в одно и то же место сопоставления с образцом, предполагается, что они относятся к одному и тому же типу, который не может работать, поскольку unit -> bool и unit, очевидно, являются двумя разными типами.

Я заметил, что ваша функция read_token объявлена ​​как рекурсивная, но не используется рекурсивно. Может быть, вы хотите изменить правые стороны сопоставления с образцом, чтобы сделать то, что вы хотите сделать?

...