如何修复Ocaml未绑定构造函数错误
我对OCaml是全新的。我试图编写一个名为H序列的基本递归函数。这是我的密码:如何修复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 我不知道如何和什么绑定
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