Elixir v1.20 釋出:現在支援漸進式類型系統了!
前言 2022 年,Elixir 團隊宣布要為這個語言加入「集合論類型系統」(set-theoretic type system)。經過四年的研發,由 CNRS 與 Remote 合作、Fresha 和 Tidewave 贊助,這個願景終於在 Elixir v1.20 中實現了第一個重要里程碑。 這篇文章由 Elixir 創始人 José Valim 親自撰寫,我來幫你整理重點,用比較輕鬆的方式看懂這次更新到底有什麼了不起。 什麼是「漸進式類型系統」? 簡單來說,Elixir v1.20 現在可以對每一個 Elixir 程式進行類型推論和漸進式類型檢查,而且不需要你寫任何類型註解(type annotations)。 這意味著什麼呢? Elixir 現在會自動幫你找出死程式碼(dead code) 會找出已驗證的 bug(verified bugs)—— 這些是如果執行到就一定會在執行時期失敗的類型錯誤 不需要你加註解、不會增加開發者負擔、誤報率極低 換句話說,你什麼都不用改,Elixir 就免費送你一堆潛在 bug 讓你修。 Elixir 的 dynamic() 類型:跟其他語言的 any() 不一樣 很多漸進式類型系統(比如 TypeScript)都有類似 any 的類型,意思是「什麼都可以,不做檢查」。但 Elixir 的漸進式類型叫做 dynamic(),而且有兩個重要特性: 1. 相容性(Compatibility) dynamic() 類型在呼叫函數時,只有當「傳入的類型」和「函數接受的類型」完全不相交(disjoint)時,才會報錯。 舉個例子: value_or_error = if value > 1 do value else "not well" end Map.fetch!(value_or_error, :some_key) 這裡 value_or_error 的類型是 dynamic(integer() or binary())。而 Map.fetch! 只接受 map。因為 integer 和 binary 跟 map 完全不重疊,所以會報一個已驗證的 bug。 ...