模式匹配与不同类型的元组

时间:2018-10-03 19:36:30

标签: ocaml

我试图弄清楚如何与用户定义的类型进行模式匹配。例如,我有这种类型。

Type custom_type = B of bool | I of int | S of string | C of custom_type * custom_type

我想模式匹配这些类型,例如说计算一个值中的整数数量。值示例:

C(C(B true, I 5), C(S "example", B false))

我想我已经非常了解它了,我知道我需要使用通配符,但是我无法写出可能存在的每个实例,因为我需要检查很多不同的值。

谢谢!

编辑:无效的代码:

let num = 0
let rec count_ints (c: custom_type):int =
match c with
| C (I(_), _) -> num + 1
| C (_, I(_)) -> num + 1
| C (C(_), _) -> count_ints c
| C (_, C(_)) -> count_ints c

2 个答案:

答案 0 :(得分:0)

您应该考虑函数中有4种情况,每个构造函数一种。您不需要匹配这些构造函数中的内容,因为您可以递归调用自己来处理它。

您的代码调用count_chars,但没有该名称的功能。如果应该是count_ints,那么这不是一个很好的递归调用。您必须递归调用一个较小的问题。如果仅递归地将c传递给自己,则会得到无限递归。

答案 1 :(得分:0)

let rec count_ints (c: custom_type):int = 
    match c with 
    | I _ -> 1 
    | C (c1,c2) -> count_ints c1 + count_ints c2 
    | _ -> 0