синтаксис для вызова метода во вложенных объектах в Ocaml

#ocaml

#ocaml

Вопрос:

Я новичок в OCaml, и я пытался создать программу, использующую стек. Итак, вот что я сделал:

  1. У меня есть объект (позже определенный ob_ctx), который имеет несколько полей, определенных следующим образом:
 
type my_custom_type = {
      nb_locals: int;
      mutable label_br: stack_of_string;
}
  
  1. У меня есть класс stack_of_string:
     class stack_of_string =
        object (self)
          val mutable the_list = ( [] : string list )
          method push x =                        
            the_list <- x :: the_list
          method pop =                          
            let result = List.hd the_list in
            the_list <- List.tl the_list;
            result
          method peek =                          
            List.hd the_list
          method size =                        
            List.length the_list
        end;;
  
  1. Я попробовал класс и методы в терминале, и они, похоже, работают нормально, но когда я пытаюсь это сделать в функции в моем файле, это не работает:
 let my_fct ctx = 
ctx.label_br#push ( function_that_returns_a_string() );
(*or ctx.label_br#push ( "a simple string" );  *)
(*or ctx.label_br#push "a simple string" ;  *)
let some_other_var = "sth" in ....
  

В нем говорится

Ошибка: эта функция имеет тип string -> unit Она применяется к слишком большому количеству аргументов; возможно, вы забыли `;’ . Команда завершается с кодом 2

Я не понимаю, почему так много аргументов, push принимает 1 аргумент, и я дал 1 аргумент. Не мог бы кто-нибудь, пожалуйста, объяснить это мне

Заранее спасибо

Ответ №1:

Вы не даете полного (или автономного) определения для my_fct . Я использовал следующее определение:

 let my_fct ctx = 
    ctx.label_br#push ( String.make 3 'x' );
    let some_other_var = "sth" in some_other_var
  

С этим определением (и другими определениями выше) ваш код отлично компилируется для меня.

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

Если нет, вы должны привести полный (автономный) пример, который вызывает ошибку, которую вы видите. В противном случае очень сложно помочь.

Комментарии:

1. » Вы можете попробовать начать заново с нуля. » Я сделал, как вы предложили, и это работает!! Большое спасибо!