2013-02-18 77 views
0

我是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可能会输出选项?我有些困惑,请帮忙。

回答

1

您的问题是substitute不是返回expr option。它只是返回expr。也许你想要的是beta_lor返回Some (substitute f 1 e2)这种情况。

编辑

对于它的价值,你的描述似乎是基于这样的想法,一个选项类型,就像是一个主流语言的指针类型,可以是一个有趣的指针或NULL。这更有启发性(在我看来)关注这样一个事实,即有两种情况:Some表达式None。你需要在OCaml中明确地打包和展开这两种情况,这在我看来是比将NULL视为合法指针值更好的。我们每天都会看到我们身边的主流模式的缺点(遗憾编辑)。

+0

好的,现在感谢它编译。但是我很困惑ocaml编译器在这种情况下如何工作用于类型推断,它是如何扫描匹配的情况并试图推导出输出类型应该是expr(替代的输出)还是None?或者,它只是看第一个案例,并推断输出应该是expr? – 2013-02-18 17:35:35

+1

它看着*所有*,并确保它们是相同的(根据需要统一类型)。在我看来,最令人困惑的是错误信息! “预期”和“看到”类型之间的区别并没有特别明确。对我来说,通常会更清楚地认为它是一种普遍的类型冲突(不同的类型应该是相同的)。 – 2013-02-18 17:44:49

+0

好的,这是有道理的,所以如果我写一些(替代f 1 e2),它将“expr选项”类型与“'选项”类型统一起来。这意味着它不能统一“expr”和“'a option”,但是这种情况是否应该自然地被看作是“expr选项”?我错过了什么吗? – 2013-02-18 17:51:00