0

我是 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 option

现在,当我编译此文件时,它报告有关我在 beta_lor 中使用的“无”行的错误:错误:此表达式的类型为 'a 选项,但预期的表达式类型为 expr

我知道 ocaml 编译器试图进行类型推断,它希望我输出一个表达式,而不是 'a 选项,但我声称 beta_lor 可能输出选项?我有点困惑,请帮助。

4

1 回答 1

1

你的问题是substitute 返回expr option。它只是返回expr。也许你想要的是beta_lor返回Some (substitute f 1 e2)那个案子。

编辑

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

于 2013-02-18T17:24:17.957 回答