如果您定义了typespec并使用不同类型的参数,则会显示类似于以下内容的错误:
binary() ... breaks the contract ... boolean()
例如这个typespec:
@spec check?(binary) :: boolean
但它似乎不适用于类型化列表,或者至少,它永远不会显示警告,如果我有一个接收字符串列表的方法,我将定义此类型规范:
@spec check?([String.t]) :: boolean
然后我可以为列表定义任何规范,并且在运行透析器时它永远不会抱怨,即:
@spec check?(list(boolean)) :: boolean
@spec check?(list(Conn)) :: boolean
@spec check?(list(number)) :: boolean
@spec check?(list(integer)) :: boolean
这是打算的吗?如果我定义了任何类型[any()]
的列表,看起来就好像
还有其他方法可以达到这个目的吗?
答案 0 :(得分:2)
发生这种情况的原因是所有列表类型都包含空列表作为有效值。
例如,在以下情况中:
Dialyzer将得出一个可能的解决方案,即如果列表为空。由于Dialyzer只会打印警告,如果它可以断定某段代码总会崩溃,那么在这种情况下它不会打印出来。
我不知道有什么好的解决方法。如果您想明确要求非空列表,可以使用例如nonempty_list(boolean)
代替list(boolean)
。