2017-02-13 5 views
0

Я только начал изучать Ocaml и я играю с рекурсивными функциями. Компилятор Ocaml сообщает мне, что рекурсивно вызов хелпера в «if h1 = h2 then helper t1 t2» вызывает ошибку: это выражение имеет тип «список» * list -> bool, но ожидалось выражение типа bool. Я понимаю, что он говорит мне, что компилятор ожидает логического, но вместо этого получает функцию, которая возвращает логическое значение. Но я понятия не имею, как я могу это исправить. Любая помощь приветствуетсяOcaml: Это выражение имеет тип 'список *' список -> bool, но ожидалось выражение типа bool

let rec a_func l = 
    let rec helper tmp l1 = function 
     | [], [] -> true 
     | _, [] -> false 
     | h1::t1, h2::t2 -> if h1=h2 then helper t1 t2 else helper [h2]@l1 t2 
    in helper [] l 

ответ

3

Ваше определение let rec helper tmp l1 = function ... определяет функцию helper которая принимает три аргументы: tmp, l1, и анонимный аргумент, который используется в шаблоне сопоставляются. Это связано с тем, что ключевое слово function вводит дополнительный аргумент, оно не означает мантра шаблона по предыдущим аргументам.

Похоже, вы хотите соответствовать по tmp и l1. В этом случае вы можете написать let rec helper tmp l1 = match tmp, l1 with .... Вы также можете написать let rec helper = function ..., но определяет функцию, которая принимает пару, поэтому вы должны назвать его как helper (t1, t2), helper ([], l) и т.д.

Вам также необходимо поставить скобки вокруг [h2]@l1. Обратите внимание, что более идиоматичным способом написания является h2::l1, но вам все равно понадобятся скобки. Наконец, OCaml предупредит вас, что у вас нет случая для шаблона ([], _::_).

+0

Благодарим за объяснение! – user1848861

 Смежные вопросы

  • Нет связанных вопросов^_^