OCaml编译类型错误,不是正确的函数预期类型
这里是OCaml的新成员 基本上,我试着编译一段代码,主要是用两个函数,但我不能编译第9行的类型错误,第26-27列字符,我说: 错误:此表达式的类型为t,但表达式的类型应为 字符串“” 基本上,第8行调用的解析函数需要字符串类型,但我不知道为什么 sexp参数的类型:OCaml编译类型错误,不是正确的函数预期类型,ocaml,Ocaml,这里是OCaml的新成员 基本上,我试着编译一段代码,主要是用两个函数,但我不能编译第9行的类型错误,第26-27列字符,我说: 错误:此表达式的类型为t,但表达式的类型应为 字符串“” 基本上,第8行调用的解析函数需要字符串类型,但我不知道为什么 sexp参数的类型: type sexp = Atom of string | List of sexp list 代码: 您给出的代码不会编译,因为第9行引用了parse,但直到稍后才定义 要定义两个相互递归的函数,需要使用let rec…和…
type sexp = Atom of string | List of sexp list
代码:
您给出的代码不会编译,因为第9行引用了
parse
,但直到稍后才定义
要定义两个相互递归的函数,需要使用let rec…和…
:
let rec f x = (* definition of f, which calls g *)
and g x = (* definition of g, which calls f *)
由于
parse
的后一个定义在第9行不可见,因此该名称必须参考以前的定义。可能在Sexp
模块中定义了一个名为parse
的函数。(这是谨慎使用open
的原因之一。)您应该发布一个小的自包含示例。由于(*一些代码*)的原因,此代码无法编译
和缺少定义。如果人们可以自己尝试您的代码,这会更容易得到帮助。谢谢!它可以工作。一个附带问题是,如何将第9行中使用的解析指定为此文件中的函数。在其他语言中,通常有类似命名空间的东西来避免命名冲突。没有简单的方法引用当前模块。惯用解决方案(IMHO)是removeopen Sexplib.Sexp
。如果使用完整的模块名过于繁重,您可以使用一个简短的名称:module s=sexpliblib.Sexp
。然后您可以使用s.Atom
等形式的名称。
let rec f x = (* definition of f, which calls g *)
and g x = (* definition of g, which calls f *)