我是OCaml的新手。我正在尝试编写这个称为H序列的基本递归函数。这是我的代码:
let rec H n =
if n == 0 then
0
else
n - H(H(H(n - 1)))
;;
print_int(H 3);我非常肯定我的函数H是正确的,但是我得到了这个错误:
File "main.ml", line 1, characters 8-9:
Error: Unbound constructor H我不知道如何和什么约束H。如果有人能给我一些建议,我们将不胜感激。如果有帮助的话,我正在使用这个网站运行我的代码:https://www.tutorialspoint.com/compile_ocaml_online.php
发布于 2020-05-03 21:23:32
在Ocaml中,标识符的第一个字符用于确定其语法类。特别地,
必须以小写字母开头。相反地
必须以大写字母开头。(它们是构造函数[]、()、(::)、true和false的5个例外)。和
types
可以以小写或大写字母开头。然而,对它们使用大写字母则更为惯用。
所以如果你定义
let rec H n =
if n == 0 then
0
else
n - H(H(H(n - 1)))编译器将H读入构造函数,因此它认为您试图以类似于
type t = C of int
let (C n) = C 1换句话说,解决问题的方法是重命名变量h。
let rec h n =
if n = 0 then
0
else
n - h(h(h(n - 1)))(不要在==中对不可变变量使用OCaml)。
如果您想知道为什么在构造函数和变量之间有这样的区别,主要原因之一是,否则就有可能编写一些非常混乱的模式匹配。例如,考虑
type t =
| X
| Y
| Z
let f x = match x with
| X -> 0
| y -> 1在模式匹配的第一个分支中
| X -> 0我们正在检查x是否是构造函数X。然而,在第二个分支,
| y -> 1我们将分支中的变量x重命名为y。在这里,我们可以使用第一个字符的情况来知道我们是哪种情况。如果没有这种语法区分,我们将需要记住在模式匹配过程中作用域中是否存在一个构造函数X或y。
https://stackoverflow.com/questions/61581480
复制相似问题