Types 不理解Ocaml类型签名

Types 不理解Ocaml类型签名,types,ocaml,signature,Types,Ocaml,Signature,我一直在努力理解这一点,在这方面再努力就会损害我与OCaml的关系,所以我想我会寻求帮助 我有一个简单的函数 好的,很酷,从下面的签名可以明显看出: val line_stream_of_channel : in_channel -> string Stream.t = <fun> 相反,我必须这样做 string Stream.t 看着你也没能让我有什么收获。我已经注意到了类似列表这样的东西的语法奇怪,你必须做一些不自然的事情 string list 而不是自然的 li

我一直在努力理解这一点,在这方面再努力就会损害我与OCaml的关系,所以我想我会寻求帮助

我有一个简单的函数

好的,很酷,从下面的签名可以明显看出:

val line_stream_of_channel : in_channel -> string Stream.t = <fun>
相反,我必须这样做

string Stream.t
看着你也没能让我有什么收获。我已经注意到了类似列表这样的东西的语法奇怪,你必须做一些不自然的事情

string list
而不是自然的

list string
但特别奇怪的是上面流类型的“.t”部分

有人能解释一下这里发生了什么,为什么事情是这样做的吗?我在谷歌上搜索了OCaml中关于显式类型签名、类型等的教程,一般来说,这些教程会引出一些对我没有帮助的非常具体的问题


谢谢大家!

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

我喜欢OCaml订单,我没有问题。我对其他订单也没有问题

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

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


类型在OCaml中可以是参数化的。例如,
int list
是一个用类型
int
参数化的列表,基本上对应于一些其他语言中的
list
。奇怪吗?这取决于你的背景。我个人认为
字符串列表
更自然,然后
列表字符串

参数化类型的语法为
。所以这两个组件都应该是类型<代码>流
不是类型,而是模块名称。符号
允许您处理在模块中定义的定义。例如,可以定义类型别名:

 type 'a stream = 'a Stream.t
然后使用它

 type string_stream = string stream
注意,
stream\u string
听起来很奇怪,不是吗

$ 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
 type 'a stream = 'a Stream.t
 type string_stream = string stream