我是Ocaml的初学者。我正在尝试编写一些关于正常顺序缩减的代码,并且被一些语法所困惑。以下是一些截断代码来隔离我的错误。关于Ocaml的无关
type expr =
| Var of char
| Num of int
| Lambda of expr
| Apply of expr * expr
let rec substitute f id e = match f with
| Num(i) -> if id == i then e else f
| _ -> f
let rec beta_lor e = match e with
| Apply(Lambda(f), e2) -> substitute f 1 e2
| Apply(e1,e2) -> beta_lor e1
| Lambda e1 -> beta_lor e1
| _ -> None
在.mli我要求的beta_lor应类型的文件: VAL beta_lor:EXPR - > EXPR选项
现在,当我编译此文件时,它会报告关于行“无差错“我在beta_lor使用: 错误:这个表达式“一个选项 但预计表达式类型expr的
据我所知,ocaml的编译器试图做类型推断,并希望我输出一个表达式,而比'一个选项,但我声称beta_lor可能会输出选项?我有些困惑,请帮忙。
好的,现在感谢它编译。但是我很困惑ocaml编译器在这种情况下如何工作用于类型推断,它是如何扫描匹配的情况并试图推导出输出类型应该是expr(替代的输出)还是None?或者,它只是看第一个案例,并推断输出应该是expr? – 2013-02-18 17:35:35
它看着*所有*,并确保它们是相同的(根据需要统一类型)。在我看来,最令人困惑的是错误信息! “预期”和“看到”类型之间的区别并没有特别明确。对我来说,通常会更清楚地认为它是一种普遍的类型冲突(不同的类型应该是相同的)。 – 2013-02-18 17:44:49
好的,这是有道理的,所以如果我写一些(替代f 1 e2),它将“expr选项”类型与“'选项”类型统一起来。这意味着它不能统一“expr”和“'a option”,但是这种情况是否应该自然地被看作是“expr选项”?我错过了什么吗? – 2013-02-18 17:51:00