W.W*_*W.W 0 ocaml functional-programming
let main() =
let base = read_int () in
let num = read_int () in
if num = reverse num && (is_base base num) = true then Printf.printf "YES"
else if is_base base num = false then Printf.printf "ERROR"
else Printf.printf"NO"
Run Code Online (Sandbox Code Playgroud)
这个表达式有类型
('a -> 'b -> 'c, out_channel, unit, unit, unit, 'a -> 'b -> 'c)
CamlinternalFormatBasics.fmt
but an expression was expected of type
('a -> 'b -> 'c, out_channel, unit, unit, unit, unit)
CamlinternalFormatBasics.fmt
Type 'a -> 'b -> 'c is not compatible with type unit
Run Code Online (Sandbox Code Playgroud)
我已经阅读了文档,但仍然不清楚printf如何在Ocaml中运行.它适用于顶层.也许有些图书馆遗失了
代码的下一行概率很高
main ()
Run Code Online (Sandbox Code Playgroud)
或类似的顶级表达式,这是您错误的真正来源.需要通过以下方式引入Toplevel表达式;;:
;; main ()
Run Code Online (Sandbox Code Playgroud)
另一个成语是写作
let () = main ()
Run Code Online (Sandbox Code Playgroud)
避免引入顶层表达式
现在,为什么你会遇到如此复杂的类型错误?答案很有趣,源于类型检测器从左到右的偏见和灵活性printf.当我们写作时,一切都开始了:
Printf.printf "ERROR" main ()
Run Code Online (Sandbox Code Playgroud)
这里,Printf.printf的类型是('a, out_channel, unit) format -> 'a指:
'a:printf采用格式字符串加上格式所需的参数
out_channel:它写在一个 out_channel
unit :最终,它返回单位.
但是,当键入函数应用程序时,类型检查器会
Printf.printf "Error" main ()看到Printf.printf应用于三个参数,因此推断出类型'a可以扩展为'b -> 'c -> 'd.但是,类型检查器会查看格式参数的类型"ERROR": ('e, 'f, 'e) format,因此推断出格式的返回类型应该是'b -> 'c -> 'd.但这与Printf.printf所需单元作为返回类型的事实相矛盾,导致您的类型错误(经过一些简化):
('a -> 'b -> 'c, out_channel,'a -> 'b -> 'c) format
but an expression was expected of type
('a -> 'b -> 'c, out_channel, unit) format
Type 'a -> 'b -> 'c is not compatible with type unit
Run Code Online (Sandbox Code Playgroud)