我是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中使用的“无”行的错误: 错误:此表达式具有类型'a选项 但是表达式的类型为expr
我理解ocaml编译器尝试进行类型推断,并且它希望我输出一个表达式,而不是'一个选项,但我声称beta_lor可能输出选项?我有点困惑,请帮忙。
答案 0 :(得分:1)
您的问题是substitute
没有返回expr option
。它只返回expr
。也许你希望beta_lor
为这种情况返回Some (substitute f 1 e2)
。
修改强>
对于它的价值,你的描述似乎是基于一种选择类型就像主流语言中的指针类型,无论是有趣的指针还是NULL。在我看来,更有启发性的是关注恰好有两种情况:Some
expr 和None
。你需要在OCaml中显式地包装和解包这两种情况,这在我看来(再次,在我看来)比将NULL视为合法的指针值要好得多。我们每天都看到我们周围的主流模式的缺点(抱歉编辑)。