2015-02-23 71 views
0

我怎麼理解,-spec只在Erlang用於透析器。類型檢查Erlang

如何在編譯時檢查類型(例如在函數中)(如何在Haskell中實現)?

+0

您可以編寫一個運行編譯器和透析器的makefile或類似文件。或者我誤解了你的問題? – legoscia 2015-02-23 11:22:01

回答

2

簡答:你不行。

Erlang是一種動態類型語言,運行時依賴的許多假設都要求它是這種方式,至少在某些地方。過去一直在討論製作強類型子集或功能純語言子集,但這兩種方法都沒有表現出值得超出透析器已經提供的功能。

這就是說,透析器是一個非常有用的工具如果你構建你的代碼來利用它

1

@ zxq9是對的。你不能。不過,我想補充說的是,除了透析器之外,您還可以將警衛添加到您的功能定義中。透析器非常適合靜態分析,但不會在運行時提供幫助。除了定義的功能和型號規格,像這樣:

-spec foo(X :: integer()) -> integer(). 
foo(X) -> X + 1. 

您也可以在函數定義中添加一個保護條件:

-spec foo(X :: integer()) -> integer(). 
foo(X) when is_integer(X) -> X + 1. 

這將確保一個例外是,如果一個意外上調類型被傳遞給函數調用。通過使用類型規範和守衛,你可以確保函數只會在指定的類型上被調用。