Erlang中确切的类型数量是多少?

问题描述:

除了您可以在其他语言中找到的数据原语和结构之外,Erlang中的完整类型列表是什么?Erlang中确切的类型数量是多少?

例如,什么是套接字句柄的类型?那么ets可以处理什么?

此外,哪些类型不可能在节点之间被序列化和交换?我认为套接字句柄必须是其中的一个,对吗?

即使在同一节点内的进程中,套接字句柄也是共享的,对吗?这是无分享原则的例外?

GC对这些共享的东西有什么行为? Erlang中的套接字实现是什么?我认为这不是一个港口,对吧?

的套接字是端口类型,它是在内置驱动程序中实现的。

在同一个节点中,套接字可以被多个进程共享;所有进程都可以调用套接字,当所有者进程退出时,套接字将被关闭。

当远程进程尝试访问套接字时,我尝试将套接字发送到远程进程(在不同节点内),例如, send(),它会引发原因“关闭”的错误。

有极少数类型的二郎神,你可以参考的功能是_ Erlang的模块???(期限),以获得建在基本类型的列表:

  • 原子
  • 位串
  • 浮子
  • 功能
  • 整数
  • 列表
  • 地图
  • PID
  • 端口
  • 参考
  • 元组

存在被从基本类型导出的第二列表:

  • 二进制:一个比特串,其大小是多字节大小
  • 布尔值:原子真假
  • 号:一个整数或
  • 记录浮法:一个元组,其第一项是表示记录名称的原子(编译器使用一个记录定义用符号,而不是索引来访问元组的不同的元素)

然后,您可以考虑基于这些基本类型的任意组合创建无限数量的类型。在一些程序,你会看到一些声明,如:

-type orddict() :: [{Key :: term(), Value :: term()}]. 

-spec is_key(Key, Orddict) -> boolean() when 
     Key :: term(), 
     Orddict :: orddict(). 

这些信息不是直接由Erlang的编译器使用,它们是由外部工具,如Dializer使用,是不是强制性的得到一个有效的代码。 Erlang的主要特性不是类型声明,而是模式匹配。因此,如果你调用一个函数,并期望形式{ok,Value}的返回值或{error,Reason}你会写类似:

Result = case f(Par) of 
    {ok,Value} -> resultWhenOk(Value); 
    {error,Reason} -> resultWhenError(Reason) 
end; 

,或者如果你不关心错误管理:

% get the Name and Age of the employee whose id is Id in a list of people List 
% using a function that return a tuple of the form 
% {PeopleType, Id, Name,Surname,Age,Sex} 
{ok,{employee,Id,Name,_,Age,_}} = find_people(Id,List);