如何将用户定义类型更改为int?

问题描述 投票:0回答:2
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?

ocaml
2个回答
1
投票

您的示例代码没有

Num
的两个定义。我假设第二个就是你想要的。

一般来说,提取值的方法是通过模式匹配。这是一个函数,如果类型为

e
,则返回 int;如果为
Num
,则返回 0:
Add

您可以在代码中以类似的方式使用模式匹配来从 
let int_val x = match x with Num i -> i | Add _ -> 0

中提取 int 值。

    


1
投票
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

编写了一个非常好的尾递归指南,其中包括树上的尾递归。这是一次很辛苦的旅程,但它可能会帮助您将此功能提升到一个新的水平。

© www.soinside.com 2019 - 2024. All rights reserved.