此表达式的类型为 unit 但表达式应为 unit -> bool 类型

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

我的建议(我在问题和最佳答案后写了这个解释): 我想用读取的字符串调用 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]) ;;

您的函数 parseZparseS 都有类型 unit -> bool。表达式 parseParen Open_paren 的类型为 unit。由于您将 parseZparseParen Open_paren 放在模式匹配的同一位置,因此它们被推断为同一类型,这无法工作,因为 unit -> boolunit 是显然是两种不同的类型。

我注意到您的函数 read_token 被声明为递归函数但未递归使用。也许您想修改模式匹配的右侧以执行您想要执行的操作?

这里是我暂时关于func的尝试代码移动read_inputread_input return 在匿名函数之后调用其他函数的类型相同。

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