2012-04-26 4 views
1

Я сделал метод класса, и я хотел бы иметь этот тип:OCaml - неверная функция типа

unit -> (dir -> 'b)

Но мой фактический метод:

method iter() = fun x -> match x with 
| Up -> if (Stack.is_empty pz) then raise Stack.Empty else if (Stack.length pz = 1) then failwith "Cannot go up" else (ignore (Stack.pop pz) ; {< a = (Stack.top pz) >}) 
| Down(v) -> match (Stack.top pz) with 
| Noeud(o, {contents = []}) -> raise Not_found 
| Noeud(o, {contents = l}) -> if mem_assoc v l then ((Stack.push (assoc v l) pz) ; {< a = (Stack.top pz) >}) else raise Not_found 

имеет тип unit -> dir -> 'b

Как я могу сделать это, чтобы он стал первым типом?

Вот пользовательские типы:

type 'a arbre = Noeud of 'a option ref * (char * 'a arbre) list ref 
    type dir = Up | Down of char 

Edit: мне это нужно, чтобы он мог выполнить к определенному интерфейсу, и из-за несоответствия типа, он не будет компилироваться. Спасибо!

ответ

6

Это не проблема. unit -> (dir -> 'b) и unit -> dir -> 'b - это тот же самый тип в OCaml! (стрелка типа является право-ассоциативной)

Не могли бы вы показать нам фактическое сообщение об ошибке, чтобы мы могли знать, где проблема?

Приложение: Вы действительно пробовали это? Если там is нет другой проблемы, вы обнаружите, что она просто сработает.

+1

Фактически, у меня нет сообщения об ошибке, теперь он компилируется отлично. Но когда я запускаю свой код в некоторых предварительно написанных тестах, in не найдет других функций ... Если я попытаюсь изменить интерфейс только для этого метода, он отлично работает. – Pacane

+0

Я не уверен, что понимаю, что вы подразумеваете под «предварительно написанными тестами» или «не найдет других функций». Опять же, реальные сообщения об ошибках и примеры помогут. :) – Ashe

+0

В конце концов, он работал, просто тип в имени интерфейса. Спасибо за вашу помощь. – Pacane

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