2017-12-18 147 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)

相關問題