关于Ocaml中没有

时间:2013-02-18 17:13:40

标签: 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中使用的“无”行的错误: 错误:此表达式具有类型'a选项        但是表达式的类型为expr

我理解ocaml编译器尝试进行类型推断,并且它希望我输出一个表达式,而不是'一个选项,但我声称beta_lor可能输出选项?我有点困惑,请帮忙。

1 个答案:

答案 0 :(得分:1)

您的问题是substitute 没有返回expr option。它只返回expr。也许你希望beta_lor为这种情况返回Some (substitute f 1 e2)

修改

对于它的价值,你的描述似乎是基于一种选择类型就像主流语言中的指针类型,无论是有趣的指针还是NULL。在我看来,更有启发性的是关注恰好有两种情况:Some expr None。你需要在OCaml中显式地包装和解包这两种情况,这在我看来(再次,在我看来)比将NULL视为合法的指针值要好得多。我们每天都看到我们周围的主流模式的缺点(抱歉编辑)。