首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复Ocaml未绑定构造函数错误

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

Stack Overflow用户
提问于 2020-05-03 20:54:33
回答 1查看 4.6K关注 0票数 0

我是OCaml的新手。我正在尝试编写这个称为H序列的基本递归函数。这是我的代码:

代码语言:javascript
复制
let rec H n = 
    if n == 0 then
        0
    else 
       n - H(H(H(n - 1)))
;;


print_int(H 3);

我非常肯定我的函数H是正确的,但是我得到了这个错误:

代码语言:javascript
复制
File "main.ml", line 1, characters 8-9:
Error: Unbound constructor H

我不知道如何和什么约束H。如果有人能给我一些建议,我们将不胜感激。如果有帮助的话,我正在使用这个网站运行我的代码:https://www.tutorialspoint.com/compile_ocaml_online.php

EN

回答 1

Stack Overflow用户

发布于 2020-05-03 21:23:32

在Ocaml中,标识符的第一个字符用于确定其语法类。特别地,

  • variables
  • types
  • record fields
  • classes
  • classes types
  • instance变量

必须以小写字母开头。相反地

  • constructors
  • modules

必须以大写字母开头。(它们是构造函数[]()(::)truefalse的5个例外)。和

types

  • polymorphic变体constructors

  • 模块

可以以小写或大写字母开头。然而,对它们使用大写字母则更为惯用。

所以如果你定义

代码语言:javascript
复制
let rec H n = 
    if n == 0 then
        0
    else 
       n - H(H(H(n - 1)))

编译器将H读入构造函数,因此它认为您试图以类似于

代码语言:javascript
复制
type t = C of int
let (C n) = C 1

换句话说,解决问题的方法是重命名变量h

代码语言:javascript
复制
let rec h n = 
    if n = 0 then
        0
    else 
       n - h(h(h(n - 1)))

(不要在==中对不可变变量使用OCaml)。

如果您想知道为什么在构造函数和变量之间有这样的区别,主要原因之一是,否则就有可能编写一些非常混乱的模式匹配。例如,考虑

代码语言:javascript
复制
type t =
| X
| Y
| Z

let f x = match x with
| X -> 0
| y -> 1

在模式匹配的第一个分支中

代码语言:javascript
复制
| X -> 0

我们正在检查x是否是构造函数X。然而,在第二个分支,

代码语言:javascript
复制
| y -> 1

我们将分支中的变量x重命名为y。在这里,我们可以使用第一个字符的情况来知道我们是哪种情况。如果没有这种语法区分,我们将需要记住在模式匹配过程中作用域中是否存在一个构造函数Xy

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61581480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档