Как передать значение рекурсивной функции вместо определения
У меня есть эта очень простая рекурсивная функция, чтобы добавить ветку в дерево из списка символов.
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, но я знаю, что может быть трудно найти подобные ошибки.