我该如何阅读这个OCaml类型签名?

4
我目前正在尝试将OCaml和GTK(使用lablgtk绑定)结合使用。然而,文档不是最好的,虽然我可以弄清楚如何使用大多数功能,但我无法更改笔记本页面(切换到不同的标签页)。
我找到了需要使用的函数,但我不知道如何使用它。文档似乎表明它在GtkPackProps.Notebook的子模块中,但我不知道如何调用它。
此外,该函数的类型签名与我以前看到的任何类型签名都不同。
 val switch_page : ([> `notebook ], Gpointer.boxed option -> int -> unit) GtkSignal.t

我认为它返回一个GtkSignal.t,但我不知道如何将第一个参数传递给函数(括号中的整个部分)。
有人有一些展示如何更改笔记本页面的示例代码吗?或者可以给我一些提示如何做到这一点?
2个回答

5
你找到了一个多态变体(polymorphic variant),它们在手册的第4.2节中有描述,类型规则总是让我很头疼。 我相信签名表明函数switch_page期望参数为GtkSignal.t,它是由两种类型参数化的抽象。
  • The first type parameter,

    [> `notebook]
    

    includes as values any polymorphic variant including notebook (that's what the greater-than means).

  • The second type parameter is an ordinary function.

如果我正确理解GtkSignal.t的文档,它实际上不是一个函数,而是一个包含三个字段的记录:
  • name 是一个字符串。
  • classe 是一个多态变量,可能是“notebook”或其他内容。
  • marshaller 是用于函数类型Gpointer.boxed option -> int -> unit的编组器。
希望这可以帮到您。如果您有更多问题,手册第4.2节关于多态变量的内容可能会对您有所帮助。

谢谢,这有点帮助——至少我现在知道从哪里开始寻找了。 - a_m0d
有什么建议可以帮我调用这个函数吗?应该是 source_notebook#S#switch_page,还是 GPack.notebook.S#switch_page 或其他方式? - a_m0d
1
这不是一个函数,但它是 GtkPackProps.Notebook.S.switch_page# 代表方法,. 代表模块字段(函数或值))。 - Rémi

5
你找到的不是一个函数,而是一个信号。在它的类型中看到的功能类型是页面切换发生时调用的回调函数的类型,但不会引起页面切换。
顺便说一下,switch_page 的类型被读作:由笔记本电脑引发的信号(GtkSignal.t),其回调具有类型 Gpointer.boxed option -> int -> unit。
一般来说,使用lablgtk时,最好远离Gtk*低级模块,而使用G[A-Z]高级模块。这些模块的API看起来像C Gtk的API,我总是使用主要的Gtk文档来帮助自己。
在你的情况下,你需要使用 GPack.notebook 对象及其 goto_page 方法。

据我所见,GPack.notebook 没有任何 goto_page 方法(http://wwwfun.kurims.kyoto-u.ac.jp/soft/lsl/lablgtk/html/GtkPackProps.Notebook.html)。 - a_m0d
抱歉,我刚刚重新仔细阅读了你的答案,你是对的 - GPack.notebook确实有一个goto_page方法 - 我会尝试使用它(使用正确的文档肯定会帮助很多 :) - a_m0d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接