Как мне прочитать эту подпись типа OCaml?

В настоящее время я экспериментирую с использованием OCaml и GTK вместе (используя привязки lablgtk). Однако документация не самая лучшая, и, хотя я могу понять, как использовать большинство функций, я застрял на смене страниц записной книжки (переход на другую вкладку).

Я нашел функцию, которую мне нужно использовать, но я не знаю, как ее использовать. Документация, кажется, предполагает, что она находится в подмодуле GtkPackProps.Notebook но я не знаю как это назвать.

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

 val switch_page : ([> `notebook ], Gpointer.boxed option -> int -> unit) GtkSignal.t

Я думаю, что это возвращает GtkSignal.t, но я понятия не имею, как передать первый параметр функции (целая часть в скобках).

Кто-нибудь получил пример кода, показывающего, как изменить страницу записной книжки, или может дать мне несколько советов, как это сделать?

2 ответа

Решение

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

кстати тип switch_page читается как: сигнал (GtkSignal.t) поднятый блокнотом [> `notebook ]чьи обратные вызовы имеют тип Gpointer.boxed option -> int -> unit

Вообще говоря, с lablgtk вам лучше держаться подальше от модулей низкого уровня Gtk* и использовать модуль высокого уровня tge G[AZ]. Эти API модуля похожи на C Gtk, и я всегда использую основной документ Gtk, чтобы помочь себе.

В вашем случае вы хотите использовать объект GPack.notebook и его метод goto_page.

Вы нашли полиморфный вариант; они описаны в руководстве в Разделе 4.2, и правила печати всегда ломают мне голову. Я верю, что подпись говорит о том, что функция switch_page ожидает в качестве аргумента GtkSignal.t, которая является абстракцией, параметризованной двумя типами:

  • Первый тип параметра,

    [> `notebook]
    

    включает в себя в качестве значений любой полиморфный вариант, включая notebook (вот что значит "больше чем").

  • Второй тип параметра является обычной функцией.

Если я читаю документацию для GtkSignal.t правильно, это не функция вообще; это запись с тремя полями:

  • name это строка
  • classe это полиморфный вариант, который может быть "блокнотом" или чем-то еще.
  • marshaller маршаллер для типа функции Gpointer.boxed option -> int -> unit,

Надеюсь, это поможет. Если у вас возникли дополнительные проблемы, раздел 4.2 руководства, посвященный полиморфным вариантам, может помочь вам.

Другие вопросы по тегам