type t=Num of int (* need to change to Num2 of int *)
type e = Num of int
| Add of e*e
let rec intp e : t =
| Num n -> t (n)
| Add (e1, e2) -> int (intp e1) + int (intp e2)
我想添加两个用户定义类型的变量,但它们无法添加用户定义类型,因此我使用 int () 进行类型转换,但出现了 Unbound value int 。如何将类型 t 更改为 int?
您的示例代码没有
Num
的两个定义。我假设第二个就是你想要的。
一般来说,提取值的方法是通过模式匹配。这是一个函数,如果类型为
e
,则返回 int;如果为 Num
,则返回 0:Add
您可以在代码中以类似的方式使用模式匹配来从
let int_val x = match x with Num i -> i | Add _ -> 0
中提取 int 值。
Num i
返回类型
intp
,则必须使用其 t
构造函数。如果我们在用 Num
构造的 intp
值上运行 e
,我们可以通过模式匹配提取其 int 值,并用 Num2
构造一个 t
值。知道Num
最终会返回一个
intp
值,我们可以对t
的每个子表达式递归调用intp
的结果使用模式匹配来提取两个int值,然后将它们相加并构造具有 Add
的 t
值。Num
type t = Num of int
type e =
| Num2 of int
| Add of e * e
let rec intp = function
| Num2 n -> Num n
| Add (e1, e2) ->
let Num n1 = intp e1 in
let Num n2 = intp e2 in
Num (n1 + n2)
进一步阅读这有一个缺点,那就是不是尾递归。但它本质上是一棵二叉树,并且
ivg编写了一个非常好的尾递归指南,其中包括树上的尾递归。这是一次很辛苦的旅程,但它可能会帮助您将此功能提升到一个新的水平。