如何解决编写几个单元定义?
我见过很多 OCaml 程序,它们的所有功能都在顶部,然后是单元定义,例如:
let rec factorial num =
if num = 0 then 1
else num * factorial (num-1)
let () =
let num2 = read_int () in
print_int (factorial num2)
这是为什么?它是否像一个主要功能?如果是这样,您应该无法使用其中的几个,对吗? 例如,处理多个输入的最佳方法是什么?编写多个单元定义?
解决方法
是的,模块顶层的单元表达式就像模块的主要功能。即,它在程序启动时执行。
只要有一个单位表达式,就可以有多个单位表达式。 ;
运算符专门用于此类情况:
let () =
Printf.printf "hello\n";
Printf.printf "world\n"
顺便说一句,我经常在我的主模块中写一个主函数:
let main () =
(* main calculation of program *)
let () = main ()
这可能是我写 C 代码多年的遗留物。
我也在其他人的代码中看到过这一点(可能我们很多人曾经写过 C 代码)。
,我真的很喜欢 Jeffrey 的回答,但如果您想了解更多详细信息以及了解 let () = foo
的含义,这里有一些课外阅读材料。
抽象地说,OCaml 程序的操作可以定义为一台机器,它可以减少表达式,直到它们变得不可约。一个不可约的表达式称为值。例如,5 + 3
被简化为 8
并且没有其他方法可以减少 8
,所以 8
是一个值。一个更复杂的值示例是 (fun x -> x + 1)
。一个更复杂的表达式示例是
(fun x -> x + 1) 5
减少到 6
。
语言的整个语义被定义为一组这样的归约规则。而 OCaml 中的程序是表单定义的有序列表,
let <pattern> = <expression>
这样当 OCaml 程序被评估(执行)时,它会减少每个定义的部分并将其分配给左侧的模式,例如,
let 5 = 2 + 3
是 OCaml 中的有效定义。它会将 2 + 3
表达式简化为 5
,然后尝试将结果值与左侧匹配。如果匹配,则评估下一个定义,依此类推。如果不是,则程序终止。
这里的 5
是一个非常简单的值,只与 5
匹配,一般来说,您的值会更复杂。然而,有一个比 5
更原始的值。它是一个类型为 unit
的值,只有一个居民,表示为 ()
。这也是减少了带有副作用的通俗表达的价值。由于在 OCaml 中每个表达式都必须归约为一个值,因此我们需要一个不表示任何值的值,即单位。例如,print_endline "foo"
简化为 ()
,副作用是将字符串 foo
发送到标准输出。
因此,当我们写
let foo () = print_endline "foo"
let () = foo ()
我们评估(减少)函数 foo
直到它达到 ()
值,这表明我们完全减少了 foo ()
。
我们也可以使用通配符匹配器并写入
let _ = foo ()
或将结果绑定到一个变量,例如,
let bar = foo ()
但是在计算结果为 ()
的表达式的左侧使用 ()
来表示右侧不会产生任何有趣的值,这被认为是一种很好的风格。它还可以防止常见错误,例如
let () = foo
会产生一个错误,说 unit -> unit
不能与 unit
匹配,甚至提供一个提示:Did you forget to provide
()' 作为参数?`
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。