Как передать значение рекурсивной функции вместо определения

У меня есть эта очень простая рекурсивная функция, чтобы добавить ветку в дерево из списка символов.

type tree = Node of bool ref * (char * tree) list ref

let rec create_branch lc = function
    [] -> Node(ref true, ref[])
    | x :: l -> Node(ref false, ref [(x, (create_branch l))])

Я ожидал бы, что это создаст дерево, содержащее только одну ветвь, которая будет иметь группу "ложных" узлов с переходами символов до конечного узла, который будет истинным.

Но я получаю ошибку:

Ошибка: Это выражение имеет тип (char * (список символов -> дерево)) ref, но ожидалось выражение из списка типа (char * tree) ref Тип список символов -> дерево не совместимо с деревом типов

Я думаю, я понимаю, что это означает, что мой рекурсивный вызов, по некоторым причинам, передается как ссылка на фактическую функцию (отсюда (char list -> tree)), а не на ее возвращаемое значение, которое будет просто дерево.

Я хотел бы знать, что я делаю не так?

1 ответ

Решение

function Ключевое слово создает лямбда-выражение, в котором вы можете сделать несколько предложений сопоставления с образцом.

Написанная вами функция принимает два параметра: lc и тот, который соответствует образцу.

Вы можете заменить function с match lc withили удалите lc починить это.

Это та же проблема с Ocaml: это выражение имеет тип 'список * ' список -> bool, но ожидалось выражение типа bool, но я знаю, что может быть трудно найти подобные ошибки.

Другие вопросы по тегам