此表达式的类型为 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]) ;;
您的函数 parseZ
和 parseS
都有类型 unit -> bool
。表达式 parseParen Open_paren
的类型为 unit
。由于您将 parseZ
和 parseParen Open_paren
放在模式匹配的同一位置,因此它们被推断为同一类型,这无法工作,因为 unit -> bool
和 unit
是显然是两种不同的类型。
我注意到您的函数 read_token
被声明为递归函数但未递归使用。也许您想修改模式匹配的右侧以执行您想要执行的操作?
这里是我暂时关于func的尝试代码移动read_input
。 read_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
我的建议(我在问题和最佳答案后写了这个解释): 我想用读取的字符串调用 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]) ;;
您的函数 parseZ
和 parseS
都有类型 unit -> bool
。表达式 parseParen Open_paren
的类型为 unit
。由于您将 parseZ
和 parseParen Open_paren
放在模式匹配的同一位置,因此它们被推断为同一类型,这无法工作,因为 unit -> bool
和 unit
是显然是两种不同的类型。
我注意到您的函数 read_token
被声明为递归函数但未递归使用。也许您想修改模式匹配的右侧以执行您想要执行的操作?
这里是我暂时关于func的尝试代码移动read_input
。 read_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