<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Elixir on 凱凱的技術筆記</title><link>https://kaikai365.com/tags/elixir/</link><description>Recent content in Elixir on 凱凱的技術筆記</description><generator>Hugo</generator><language>zh-TW</language><lastBuildDate>Fri, 05 Jun 2026 11:59:31 +0800</lastBuildDate><atom:link href="https://kaikai365.com/tags/elixir/index.xml" rel="self" type="application/rss+xml"/><item><title>Elixir v1.20 釋出：現在支援漸進式類型系統了！</title><link>https://kaikai365.com/posts/elixir-v1-20-gradually-typed-language/</link><pubDate>Fri, 05 Jun 2026 11:59:31 +0800</pubDate><guid>https://kaikai365.com/posts/elixir-v1-20-gradually-typed-language/</guid><description>&lt;h2 id="前言">前言&lt;/h2>
&lt;p>2022 年，Elixir 團隊宣布要為這個語言加入「集合論類型系統」（set-theoretic type system）。經過四年的研發，由 CNRS 與 Remote 合作、Fresha 和 Tidewave 贊助，這個願景終於在 &lt;strong>Elixir v1.20&lt;/strong> 中實現了第一個重要里程碑。&lt;/p>
&lt;p>這篇文章由 Elixir 創始人 José Valim 親自撰寫，我來幫你整理重點，用比較輕鬆的方式看懂這次更新到底有什麼了不起。&lt;/p>
&lt;hr>
&lt;h2 id="什麼是漸進式類型系統">什麼是「漸進式類型系統」？&lt;/h2>
&lt;p>簡單來說，Elixir v1.20 現在可以對&lt;strong>每一個&lt;/strong> Elixir 程式進行類型推論和漸進式類型檢查，而且&lt;strong>不需要你寫任何類型註解&lt;/strong>（type annotations）。&lt;/p>
&lt;p>這意味著什麼呢？&lt;/p>
&lt;ul>
&lt;li>Elixir 現在會自動幫你找出&lt;strong>死程式碼&lt;/strong>（dead code）&lt;/li>
&lt;li>會找出&lt;strong>已驗證的 bug&lt;/strong>（verified bugs）—— 這些是如果執行到就&lt;strong>一定會&lt;/strong>在執行時期失敗的類型錯誤&lt;/li>
&lt;li>不需要你加註解、不會增加開發者負擔、誤報率極低&lt;/li>
&lt;/ul>
&lt;p>換句話說，你什麼都不用改，Elixir 就免費送你一堆潛在 bug 讓你修。&lt;/p>
&lt;hr>
&lt;h2 id="elixir-的-dynamic-類型跟其他語言的-any-不一樣">Elixir 的 &lt;code>dynamic()&lt;/code> 類型：跟其他語言的 &lt;code>any()&lt;/code> 不一樣&lt;/h2>
&lt;p>很多漸進式類型系統（比如 TypeScript）都有類似 &lt;code>any&lt;/code> 的類型，意思是「什麼都可以，不做檢查」。但 Elixir 的漸進式類型叫做 &lt;code>dynamic()&lt;/code>，而且有兩個重要特性：&lt;/p>
&lt;h3 id="1-相容性compatibility">1. 相容性（Compatibility）&lt;/h3>
&lt;p>&lt;code>dynamic()&lt;/code> 類型在呼叫函數時，只有當「傳入的類型」和「函數接受的類型」&lt;strong>完全不相交&lt;/strong>（disjoint）時，才會報錯。&lt;/p>
&lt;p>舉個例子：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-elixir" data-lang="elixir">&lt;span style="display:flex;">&lt;span>value_or_error &lt;span style="color:#f92672">=&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> value &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#66d9ef">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> value
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;not well&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Map&lt;/span>&lt;span style="color:#f92672">.&lt;/span>fetch!(value_or_error, &lt;span style="color:#e6db74">:some_key&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>這裡 &lt;code>value_or_error&lt;/code> 的類型是 &lt;code>dynamic(integer() or binary())&lt;/code>。而 &lt;code>Map.fetch!&lt;/code> 只接受 map。因為 integer 和 binary 跟 map 完全不重疊，所以會報一個&lt;strong>已驗證的 bug&lt;/strong>。&lt;/p></description></item></channel></rss>