类型化列表类型指定从未打破了合同
如果你定义一个类型指定和使用不同类型的参数,它会显示类似的错误:类型化列表类型指定从未打破了合同
binary() ... breaks the contract ... boolean()
例如,这类型指定:
@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()]
定义的列表是否有其他的方式来实现这一目标?
回答:
发生这种情况的原因是所有列表类型都将空列表包含为有效值。
例如,在下面的情况:
- 调用函数与布尔值可能为空列表
- 函数接受字符串
透析器将完成的可能是空列表有一个可能的解决方案,即如果列表是空的。由于Dialyzer只能打印出警告,因为它可以断定某段代码总是会崩溃,所以在这种情况下它不打印。
我不知道有什么好的解决方案。如果你想明确地要求非空列表,你可以使用例如nonempty_list(boolean)
而不是list(boolean)
。
以上是 类型化列表类型指定从未打破了合同 的全部内容, 来源链接: utcz.com/qa/261945.html