OCaml编译类型错误,不是正确的函数预期类型

OCaml编译类型错误,不是正确的函数预期类型,ocaml,Ocaml,这里是OCaml的新成员 基本上,我试着编译一段代码,主要是用两个函数,但我不能编译第9行的类型错误,第26-27列字符,我说: 错误:此表达式的类型为t,但表达式的类型应为 字符串“” 基本上,第8行调用的解析函数需要字符串类型,但我不知道为什么 sexp参数的类型: type sexp = Atom of string | List of sexp list 代码: 您给出的代码不会编译,因为第9行引用了parse,但直到稍后才定义 要定义两个相互递归的函数,需要使用let rec…和…

这里是OCaml的新成员

基本上,我试着编译一段代码,主要是用两个函数,但我不能编译第9行的类型错误,第26-27列字符,我说:

错误:此表达式的类型为t,但表达式的类型应为 字符串“”

基本上,第8行调用的解析函数需要字符串类型,但我不知道为什么

sexp参数的类型:

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)是remove
open 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 *)