2017-12-18 107 views
1

如果你定义一个类型指定和使用不同类型的参数,它会显示类似的错误:类型化列表类型指定从未打破了合同

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()]

定义的列表是否有其他的方式来实现这一目标?

回答

2

发生这种情况的原因是所有列表类型都将空列表包含为有效值。

例如,在下面的情况:

  • 调用函数与布尔值可能为空列表
  • 函数接受字符串

透析器将完成的可能是空列表有一个可能的解决方案,即如果列表是空的。由于Dialyzer只能打印出警告,因为它可以断定某段代码总是会崩溃,所以在这种情况下它不打印。

我不知道有什么好的解决方案。如果你想明确地要求非空列表,你可以使用例如nonempty_list(boolean)而不是list(boolean)

相关问题