如何修复Ocaml未绑定构造函数错误

如何修复Ocaml未绑定构造函数错误,ocaml,Ocaml,我对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 我不知道如何和什么绑定

我对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。如果有人能给我一些建议,我将不胜感激。如果有帮助,我将使用此网站运行我的代码:
在Ocaml中,标识符的第一个字符用于确定其语法类。特别是,

  • 变数
  • 类型
  • 记录字段
  • 班级
  • 类类型
  • 实例变量
必须以小写字母开头。相反地

  • 建设者
  • 模块
必须以大写字母开头。(它们是构造函数
[]
()
(:)
true
false
的5个例外)。 及

  • 模块类型
  • 多态变体构造器
可以以小写或大写字母开头。然而,对它们使用大写更为惯用

所以如果你正在定义

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=
如果n=0,则
0
其他的
n-h(h(h(n-1)))
(不要对OCaml中的不可变变量使用
==

如果您想知道为什么构造函数和变量之间有这样的区别,其中一个主要原因是,否则就有可能编写一些非常混乱的模式匹配。例如考虑< /P>
t型=
|X
|Y
|Z
设f x=将x与
|X->0
|y->1
在模式匹配的第一个分支中

|X->0
我们正在检查
x
是否是构造函数
x
。 但在第二个分支中,

| y -> 1
我们正在将分支中的变量
x
重命名为
y
。 在这里,我们可以使用第一个字符的大小写来知道我们在哪种情况下。如果没有这种语法上的区别,我们将需要记住在模式匹配过程中范围内是否存在构造函数
X
y