2016-01-22 2 views
2

Я выполняю функцию в OCaml, и я хочу подсчитать количество итераций в переменной n. Это функция:Проблемы с рекурсивной функцией в OCaml

let mapdoble f1 f2 l = 
let rec aux n f_1 f_2 l1 l2= match(n,f_1,f_2,l1,l2) with 
    (n,_,_,[],l2) -> l2 
    | (n,f_1,_,h::t,l2) when n mod 2 = 0 -> aux n+1 f1 f2 t [email protected][f_1 h] 
    | (n,_,f_2,h::t,l2) when n mod 2 = 1 -> aux n+1 f1 f2 t [email protected][f_2 h] 
in 
    aux 0 f1 f2 l [];; 

Когда я скомпилировать у меня есть эта ошибка, я не знаю, что это такое:

Error: This expression has type 'a -> 'b -> 'c list -> 'd -> 'd but an expression was expected of type int 
+1

Я думаю, что вы просто отсутствуете круглые скобки вокруг двух экземпляров 'n + 1'. –

+0

@ReimerBehrends пишет, вам нужно поставить круглые скобки вокруг 'n + 1'. Вы также должны соответствовать всем случаям, компилятор должен предупредить вас об этом тоже с примером. – cago

ответ

1

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

aux n+1 f1 f2 t [email protected][f_1 h] 

фактически разобран компилятором как:

(aux n) + (1 f1 f2 t l2) @ ([f_1 h]) 

теперь, я надеюсь, это очевидно, почему вы получили так странные сообщения компилятора. В частности, вы пытаетесь применить оператор (+) к результату aux n, который на самом деле является функцией четырех аргументов и определенно не является int.

Так правильная версия будет:

aux (n + 1) f1 f2 t (l2 @ [f_1 h]) 

У вас есть также некоторые проблемы с сопоставлением с образцом, это не неопровержимое, но это выходит за рамки вопроса.

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