Сопоставление шаблонов с различными типами кортежей - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь выяснить, как сопоставить шаблон с пользовательскими типами.Например, у меня есть этот тип.

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 голосов
/ 05 октября 2018
let rec count_ints (c: custom_type):int = 
    match c with 
    | I _ -> 1 
    | C (c1,c2) -> count_ints c1 + count_ints c2 
    | _ -> 0
0 голосов
/ 03 октября 2018

Вы должны подумать о том, чтобы в вашей функции было 4 случая, по одному для каждого конструктора.Вам не нужно сопоставлять то, что находится внутри этих конструкторов, потому что вы можете рекурсивно вызывать себя, чтобы справиться с этим.

Ваш код вызывает count_chars, но функции с таким именем нет.Если он должен быть count_ints, то это не очень хороший рекурсивный вызов.Вы должны сделать рекурсивный вызов по меньшей проблеме.Если вы просто передадите c себе рекурсивно, вы получите бесконечную рекурсию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...