【问题标题】:Not understanding Ocaml type signatures不了解 Ocaml 类型签名
【发布时间】:2015-04-01 15:09:06
【问题描述】:

我一直在努力尝试理解这一点,并且更努力地努力会损害我与 OCaml 的关系,所以我想我会寻求帮助。

我有一个来自this site的简单函数

let line_stream_of_channel channel =
Stream.from
  (fun _ ->
     try Some (input_line channel) with End_of_file -> None);;

好吧,很酷,从它下面的签名可以清楚地看出:

val line_stream_of_channel : in_channel -> string Stream.t = <fun>

in_channel 是参数,Stream.t 是返回值。

现在为什么在 OCaml 中我不能这样做:

Stream string

而我必须这样做

string Stream.t

看着the type signature of Stream 也没有真正让我有所收获。我注意到与列表之类的东西相同的语法怪异,你必须做不自然的事情

string list

而不是自然

list string

但特别奇怪的是上面 Stream 类型的“.t”部分。

谁能解释一下这里发生了什么以及为什么会这样?我在 OCaml 中搜索了关于显式类型签名、类型等的教程,一般来说,它们会回到这里提出对我没有真正帮助的非常具体的问题。

谢谢!

【问题讨论】:

    标签: types ocaml signature


    【解决方案1】:

    在 OCaml 的参数化类型中,类型构造函数名称位于参数名称之后。这就是它的工作方式。有些语言(例如 Haskell)使用另一种顺序。

    我喜欢 OCaml 顺序,我没有任何问题。其他订单我也没有问题。

    名称t 被定义为Stream 模块中的参数化类型。没有什么比这更棘手的了。

    但是,请注意line_stream_of_channel 的返回类型是string Stream.t,而不仅仅是Stream.tStream.t 本身不是一种类型。 (它是类型级别的函数,或类型构造函数。)

    $ ocaml
            OCaml version 4.01.0
    
    # Some 3;;
    - : int option = Some 3
    # ^D
    
    $ ghci
    GHCi, version 7.4.2: http://www.haskell.org/ghc/  :? for help
    Prelude> :t Just (3 :: Integer)
    Just (3 :: Integer) :: Maybe Integer
    

    【讨论】:

      【解决方案2】:

      在 OCaml 中类型可以是参数的。比如int list是一个参数化了int类型的列表,在其他一些语言中基本对应list&lt;int&gt;。很奇怪吗?这取决于你的背景。我个人觉得string list更自然,然后list string

      参数化类型的语法是&lt;parameter-type&gt; &lt;parametrized-type&gt;。所以这两个组件都应该是类型。 Stream 不是类型,它是模块名称。符号&lt;module-name&gt; . &lt;name&gt; 允许您处理模块中定义的定义。例如,你可以定义一个类型别名:

       type 'a stream = 'a Stream.t
      

      然后使用它

       type string_stream = string stream
      

      注意,stream_string 听起来很奇怪,不是吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多