首页 > 解决方案 > Erlang 从超类型中排除类型

问题描述

在 Erlang 中,是否可以通过从超类型中排除子类型来定义类型?例如,我将如何定义“除pid()”之外的类型:

-type anything_but_pid() :: ...?

阅读有关主管数据类型的文档,我遇到了这个类型规范child_id(),它将类型定义为term(),然后Not a pid()在下面的评论中说:

child_id() = term()

不是一个pid()

如果我不想明确列出所有可能的类型,这是我能做的最好的吗?

标签: typeserlang

解决方案


不,从 OTP 23(甚至 24)开始,不支持此功能。

此外,在这种情况下期望 Dialyzer 提供帮助是不明智的,因为 Dialyzer 经常过于近似,出于几个原因,虽然我不认为它会term()立即变成这样的类型,但它很可能会在第一个给定的机会(例如,无论您在哪里调用此类函数)。


推荐阅读