代码之家  ›  专栏  ›  技术社区  ›  Kris

这个签名对“String.sub”有什么意义:“(String,String)Blit.sub`

  •  0
  • Kris  · 技术社区  · 4 年前

    我正在utop中学习/玩ocaml。遵循 real world ocaml book

    所以我很自然地开始了:

    open Base;;
    

    接下来我尝试:

    utop # String.sub "Hello world!" 3 4;;
    Line 1, characters 0-10:
    Warning 6 [labels-omitted]: labels pos, len were omitted in the application of this function.
    Line 1, characters 0-10:
    Warning 6 [labels-omitted]: labels pos, len were omitted in the application of this function.
    - : string = "lo w"
    

    好吧,大致如预期。 Base 取代了许多标准功能,如 String.sub 版本中使用了带有标签的论点以保持清晰(可以说是一件好事,所以我对此没有任何抱怨)。

    但这让我感到困惑。当我试图检查改进后的签名/类型时 String.sub ,我希望看到类似于“标准”的改进函数签名 String.sub 签名( string -> int -> int -> string )但带有标记的自变量。相反,我看到的是:

    utop # String.sub;;
    - : (string, string) Blit.sub = <fun>
    

    这是什么意思?一个(天真的)用户如何使用它来确定调用 String.sub 作用

    例如,我如何从这样的签名中找到答案 (string, string) Blit.sub 。。。

    • 它是一个函数?
    • 它期望什么类型的论点?
    • 它期望在论点上贴上什么标签?
    • 它返回什么类型的值?
    0 回复  |  直到 4 年前
        1
  •  2
  •   ivg    4 年前

    Blit.sub 是函数类型的类型别名。但让我们自己去发现吧。我们可以使用 #show 指示输出检查其类型,直到我们得到满意的结果,

    # #show String.sub;;
    val sub : (Base.String.t, Base.String.t) Base__.Blit.sub
    # #show Base__.Blit.sub;;
    type ('src, 'dst) sub = ('src, 'dst) Base__.Blit_intf.sub
    # #show Base__.Blit_intf.sub;;
    type ('src, 'dst) sub = 'src -> pos:int -> len:int -> 'dst
    

    现在让我们替换 'src 'dst 参数 string ,因为我们 (string, string) sub 我们得到了 String.sub

    String.sub : string -> pos:int -> len:int -> string
    

    如果您使用merlin和合适的代码编辑器,这会容易得多。您可以要求编辑器展开类型,因此需要几毫秒才能到达根,Merlin也会为您执行替换。例如,在我的Emacs中,它只是 C-c C-t 在类型上。同样的情况也适用于可以通过一次按键轻松输入的文档(但在这种情况下不是这样,因为该函数在Base中缺少文档)。您还可以轻松地跳转到函数的定义或声明。因此,如果你想在OCaml中发挥作用,可以考虑建立一个良好的开发环境,比如Emacs、Vim、Visual Studio Code或其他一些环境。

    推荐文章