Jac*_*ale 4 ocaml functional-programming
我完全不明白interfaceOCaml中的工作原理.
我们来看一个例子:

那么'这里的意思是什么?我的意思是我明白,在描述功能时,'a意味着arbitrary type.那么它的含义是什么?这是arbitrary set什么意思?
另外,为什么要把'放在前面set?
在解释这个例子时,Jason Hickey的Objective Caml简介说:
我们需要抽象地定义一组多态类型的集合.也就是说,在接口中,我们将声明一个类型'一个集合而不给出定义,阻止程序的其他部分知道或取决于我们选择的集合的特定表示.
从上面的陈述,我猜这意味着in interface definition, we should hide the implementation details.但隐藏了哪些细节?
它说,在实现文件中type 'a set = 'a list.
那怎么办?
这是this set only takes a list什么意思?如果它确实意味着这一点,是否有必要在接口文件中告诉它,因为这个用户set应该知道它只需要列表,对吧?
那么'这里的意思是什么?
这就像函数的参数多态(在Java中称为泛型),但对于类型.在这个代码集中哪个商店的int将具有类型int set,字符串--- string set等等'a'在前面,因为它是常见的OCaml语法.修改后的语法类型变量是在类型名后写的:like list int或set list int.有关不同类型的多态性的更多信息,我可以向您推荐一本书Types at programming languages,第五部分:多态性.如果您了解函数的参数多态,我认为增强您对类型的知识并不困难.
什么细节被隐藏了?
在ML文件中,类型'a set被定义为元素列表.要搜索列表中的某个元素,必须遍历列表并调用(=)每个元素(这是函数的List.mem工作方式).在OCaml中的AFAIR stdlib集实现为平衡树,并且存储在集合中的值应该具有函数compare: t -> t -> int,其中存储在集合中t的元素的类型.但是,可以不同地定义集合,如果仅查看.mli中的抽象类型,则只能猜测它是如何在.ml文件中实现的.
实际上,在这个定义中,类型'a list已被用于实现类型'a set,但是从接口文件中,这些信息是不可见的 - 隐藏的部分是set类型实际上是一个事实list.模块的实现方式以及选择哪些信息可供外部世界使用,使程序可以在set不知道如何制作的情况下使用该类型.
这是软件设计的一个重要特性,因为它允许开发人员更改该模块的实现,而无需更改使用它的代码.使类型抽象强制执行该分离:如果您尝试将a list用作set模块外部,则会出现类型错误.
输入'a set ='列表
AFAIR,这一行引入了一个'类型同义词'(或别名):这里和下面的类型set是相同的list,你可以使用set期望的函数,list反之亦然.
当你看到'a set你应该明白它只是一组东西时,当你把string它设置然后它将是一个string set.如果你看到'a set你不能说什么存储或将存储在这个集合中,但如果你看到string set,你可以.上面的书中也提到了类型同义词.
PS
所以你的意思是输入'a set ='一个列表表明该集合期待列表作为参数?
不,它没有.您只需在此行中添加新类型别名即可.它不会收缩许多可以替换为'a type变量的类型.如果你写
# type 'a set = 'a list;;
type 'a set = 'a list
# let create x : _ set = [x];;
val create : 'a -> 'a set = <fun>
Run Code Online (Sandbox Code Playgroud)
然后
List.map ((+)1) (create 2);;
Run Code Online (Sandbox Code Playgroud)
编译器将推断的类型create 2为int set(因为一个int值用于类型的参数'a的create,和该函数的返回类型是'a set),那么它会寻找在其类型别名(同义词)的表,当它会明白该类型set与类型相同,list它将继续类型推断的过程.
您应该了解在创建新同义词时应该编写正确数量的类型变量,即type 'a new_t = ('a*'b) list对我和编译器都没有任何意义.左边应该至少有与右边一样多的类型变量: type ('a, 'b) new_t = ('a * 'b) list例如,有效.