Syntax 在OCaml中,如何区分*和、,?

Syntax 在OCaml中,如何区分*和、,?,syntax,ocaml,Syntax,Ocaml,我试图实现一个带有键值元组的树。我尝试了以下方法,以及将*替换为,和反之亦然 type ('k,'v) tree = | Leaf | Node of ('k*'v) * ('k*'v) tree * ('k*'v) tree;; module type Dictionary = sig type ('k,'v) t val empty : ('k,'v) t end;; module TreeDict : Dictionary = struct type ('k,'v

我试图实现一个带有键值元组的树。我尝试了以下方法,以及将
*
替换为
和反之亦然

type ('k,'v) tree =
  | Leaf
  | Node of ('k*'v) * ('k*'v) tree * ('k*'v) tree;;

module type Dictionary = sig 
  type ('k,'v) t
  val empty : ('k,'v) t
end;;
module TreeDict : Dictionary = struct 
  type ('k,'v) t = ('k*'v) tree
  let empty = Leaf
end;;

这表示树构造函数接受两个参数,但是如果我将
*
更改为
在构造函数中,我会得到一个非描述性错误。我不太清楚什么时候使用哪个,我猜这就是错误的根源。我知道您使用逗号创建了元组的特定实例,并使用带星号的元组构建了类型定义。但这里并不总是清楚哪个是哪个,或者实际上是否有其他规则在起作用

符号
*
用于在数据类型定义中分隔元组的元素。
符号用于分隔具有多个变量的参数化类型中的类型变量

例如,在名为*age*类的
学生中,我们用三个参数定义了一个构造函数。要使用此构造函数创建值,我们将参数作为元组
Student(“Jon”,21,“CS”)
传递。请注意,我们使用逗号分隔元组的参数

在您的示例中,type
('k,'v)tree
带有两个类型变量。因此,我们需要经常引用它,就像这样(不是
('k*'v)树
,而是
('k,'v)树

正确的定义应该是这样的

type ('k,'v) tree =
  | Leaf
  | Node of 'k * 'v * ('k,'v) tree * ('k,'v) tree
请注意,
('k*'v)
周围的括号具有特殊的语义,因为下面定义了一个具有四个参数(key、value、lhs、rhs)的构造函数

而以下

  | Node of ('k * 'v) * ('k,'v) tree * ('k,'v) tree
使用三个参数定义构造函数,例如,
节点(数据、lhs、rhs)
,其中
数据
表示为
(键、值)
对。具有3个参数的表示将使用更多内存,因为每个
(键、值)
对将存储在树外部的盒式表示中。或者图形化地1



1) 在实际实现中,
数据
指针实际上将指向
,即指向装箱值的第一个字段,但我认为从概念上来说,最好忽略此实现细节。

在最后一部分中,“使用两个参数定义构造函数:(binding,lhs,rhs)…”您是指三个参数吗?我以前也被这件事弄糊涂了,我不知道从哪里开始读它。。。也许你可以展示每个构造函数变量如何被用来构造其类型的值?@user633183,是的,我的意思是三个,当然,只是一个输入错误。我添加了一个图形示例,希望它能澄清问题。
  | Node of ('k * 'v) * ('k,'v) tree * ('k,'v) tree
  4 arguments              3 arguments
  representation           representation 
  (5 words/node)           (7 words/node)

  +--------+               +--------+
  | header |               | header |
  +--------+               +--------+     +--------+
  |  key   |               | data   |---->| header | 
  +--------+               +--------+     +--------+
  |  value |      vs.      | left   |     |   key  |
  +--------+               +--------+     +--------+
  |  left  |               | right  |     | value  |
  +--------+               +--------+     +--------+
  |  right |
  +--------+