<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: josevalim</title><link>https://news.ycombinator.com/user?id=josevalim</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sat, 13 Jun 2026 08:51:19 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=josevalim" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by josevalim in "Elixir v1.20: Now a gradually typed language"]]></title><description><![CDATA[
<p>I don't think these articles fully cover (pun intended) the claims being made.<p>First of all, we need to separate "types" from "static type checking".  Elixir always had types and types by themselves won't eliminate tests. You can combine types with type checkers, as well as tests themselves (as described in the first article), to aid software verification. Plus many of the techniques discussed in the article (property-based testing, static analysis, etc) are available to dynamically typed languages too.<p>Some notes on the first article:<p>> For example, there is no test we could write that would show that our function never throws an exception or never goes in to an infinite loop, or contains no invalid references. Only static analysis can do this.<p>Static analysis is doing a lot of heavy lifting here. When applied to type checking, where it can prove absence of exceptions depends entirely on how expressive the type system and checker are.<p>For example, this Haskell function can fail at runtime even though it type checks:<p><pre><code>    maxPosInteger :: (Ord a, Num a) => [a] -> a
    maxPosInteger xs = maximum (filter (> 0) xs)
</code></pre>
If `xs` contains no positive elements, maximum fails. The type system does not rule this out.<p>As the article itself later discusses, proving stronger properties requires more expressive type systems, such as dependent types. Those systems can prove the absence of additional classes of failures, but they come with their own costs in complexity, ergonomics, inference, compile times, and so on. My recent ElixirConf talk touched on these trade-offs: <a href="https://www.youtube.com/watch?v=Ay-gnCqDw9o" rel="nofollow">https://www.youtube.com/watch?v=Ay-gnCqDw9o</a><p>But overall the article does not discuss coverage. Under some of the scenarios it presents, such as finite domains, exhaustive testing guided by coverage can prove the absence of bugs too. Additionally, some of the concerns the article has about Python, such as runtime redefinition and excessive polymorphism, do not really apply to dynamic languages like Elixir and Clojure.<p>> Correctness oracles abound. We have test suites, fuzzers and property-based testers, runtime sanitizers, static analyzers, linters, strong type systems, and formal verifiers. Any time such a tool can be made available to the LLM, we’ll reap the benefits in terms of not dealing with bugs the hard way, later on.<p>I completely agree with that framing. Static type systems are valuable tools, but they're one tool among many. My overall point is that I wouldn't draw the line at static typing as the "must have" mechanism for software quality, especially in the context of AI-assisted development where multiple correctness oracles can be composed together.<p>Thanks for sharing, those were great reads!</p>
]]></description><pubDate>Fri, 05 Jun 2026 09:30:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=48410116</link><dc:creator>josevalim</dc:creator><comments>https://news.ycombinator.com/item?id=48410116</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48410116</guid></item><item><title><![CDATA[New comment by josevalim in "Elixir v1.20: Now a gradually typed language"]]></title><description><![CDATA[
<p>Lovely!!!</p>
]]></description><pubDate>Thu, 04 Jun 2026 15:36:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=48400237</link><dc:creator>josevalim</dc:creator><comments>https://news.ycombinator.com/item?id=48400237</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48400237</guid></item><item><title><![CDATA[New comment by josevalim in "Elixir v1.20: Now a gradually typed language"]]></title><description><![CDATA[
<p>That’s very exciting! Is there anywhere I could follow you for updates? If you don’t want to share it publicly, and is ok with sharing it privately, my email is my username on gmail. Thank you!!</p>
]]></description><pubDate>Thu, 04 Jun 2026 14:20:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=48399068</link><dc:creator>josevalim</dc:creator><comments>https://news.ycombinator.com/item?id=48399068</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48399068</guid></item><item><title><![CDATA[New comment by josevalim in "Elixir v1.20: Now a gradually typed language"]]></title><description><![CDATA[
<p>Agreed on the guardrails bit. My point is that we still don't have much evidence that static types are an effective way to constrain the search space for coding agents, or how much value they add on top of other mechanisms. Redundancy can certainly be beneficial, but how much and at what cost?<p>On expressiveness, people often frame it as a dynamic-language goal, but a large portion of type system research is precisely about making type systems more expressive so they can describe a wider range of programs and invariants. This is clearly something both camps value. I suppose another interesting benchmark could be: how do coding agents perform across languages with different degrees of type-system expressiveness?<p>We may directionally agree, but it is hard to draw conclusions without measurements. Overall, I'd say this is much more of an open question than people give it credit for.</p>
]]></description><pubDate>Thu, 04 Jun 2026 08:53:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=48395981</link><dc:creator>josevalim</dc:creator><comments>https://news.ycombinator.com/item?id=48395981</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48395981</guid></item><item><title><![CDATA[New comment by josevalim in "Elixir v1.20: Now a gradually typed language"]]></title><description><![CDATA[
<p>Please file a bug report if you can indeed isolate/reproduce it (and please ping me on GitHub once you do)!</p>
]]></description><pubDate>Thu, 04 Jun 2026 08:40:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=48395901</link><dc:creator>josevalim</dc:creator><comments>https://news.ycombinator.com/item?id=48395901</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48395901</guid></item><item><title><![CDATA[New comment by josevalim in "Elixir v1.20: Now a gradually typed language"]]></title><description><![CDATA[
<p>No, this comes from interacting with the community, companies, and large projects throughout the years, followed by research, publishing of papers, and careful analysis on the costs and benefits of introducing said feature! Only then we added it.</p>
]]></description><pubDate>Thu, 04 Jun 2026 07:56:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=48395555</link><dc:creator>josevalim</dc:creator><comments>https://news.ycombinator.com/item?id=48395555</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48395555</guid></item><item><title><![CDATA[New comment by josevalim in "Elixir v1.20: Now a gradually typed language"]]></title><description><![CDATA[
<p>> Honest question, in the era of vibe and AI assisted coding is there any advantages of using untyped programming languages, apart from the fact that non-typed languages has more traning data for the LLM?<p>Author here.<p>Type systems restrict which programs can be expressed and increasing expressiveness often requires increasing type-system complexity (which, speaking from experience, both humans and agents will struggle with). Plus they are not the only mechanism to assert correctness (they only validate a subset of your program correctness and do not replace tests) and you are still on your own when it comes to actually recovering from unexpected errors (something Erlang/Elixir were designed for).<p>I'd say there are two flip sides to your question:<p>1. Given types do not replace tests, if you can use AI to automate full test coverage, are there actual benefits in static typing for coding agents? The downside of tests for humans is that we suck at writing them (but guided agents can do better) and they can take time to run (which agents do not care)<p>2. Do we actually have any data or evaluations that show which typing discipline is better for agents? The only benchmark I am aware of [AutoCodeBenchmark] has Elixir come first (dynamic) and C# as second (static), so it doesn't answer the question. There are other benchmarks that show dynamic languages require fewer tokens to solve problems (but that's not a metric I particularly care about)<p>My gut feeling is that local structure, documentation, quality and quantity in the training data, etc are likely to play a more important role than typing for coding agents. I'd also love to measure how agents perform on specific domains. If you are writing concurrent software, how does Elixir/Java/Rust/Go compare? But without data, it's hard to say.<p>[AutoCodeBenchmark]: <a href="https://github.com/Tencent-Hunyuan/AutoCodeBenchmark" rel="nofollow">https://github.com/Tencent-Hunyuan/AutoCodeBenchmark</a></p>
]]></description><pubDate>Thu, 04 Jun 2026 07:09:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=48395152</link><dc:creator>josevalim</dc:creator><comments>https://news.ycombinator.com/item?id=48395152</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48395152</guid></item><item><title><![CDATA[New comment by josevalim in "Elixir v1.20: Now a gradually typed language"]]></title><description><![CDATA[
<p>That happens with a single module but not across modules because being able to hot code load modules is an essential ability in Erlang/Elixir.</p>
]]></description><pubDate>Thu, 04 Jun 2026 06:48:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=48394984</link><dc:creator>josevalim</dc:creator><comments>https://news.ycombinator.com/item?id=48394984</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48394984</guid></item><item><title><![CDATA[New comment by josevalim in "Elixir v1.20: Now a gradually typed language"]]></title><description><![CDATA[
<p>You are mixing runtime and compile-time dependencies. Runtime dependencies (circular or not) have no impact on compilation performance and stability. Phoenix does include <i>one</i> circular dependency (the layout is rendered by your endpoint and it references your endpoint) but it is a runtime one.</p>
]]></description><pubDate>Thu, 04 Jun 2026 06:44:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=48394936</link><dc:creator>josevalim</dc:creator><comments>https://news.ycombinator.com/item?id=48394936</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48394936</guid></item><item><title><![CDATA[New comment by josevalim in "Elixir v1.20: Now a gradually typed language"]]></title><description><![CDATA[
<p>That can be a concern indeed but it is worth noting that strong arrows compose/propagate. So if you have a function without guards that calls a function that guards on said types, the caller is also strong! We will likely have mechanisms to measure "strength" when we introduce type annotations.</p>
]]></description><pubDate>Wed, 03 Jun 2026 21:35:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=48390435</link><dc:creator>josevalim</dc:creator><comments>https://news.ycombinator.com/item?id=48390435</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48390435</guid></item><item><title><![CDATA[New comment by josevalim in "Elixir v1.20: Now a gradually typed language"]]></title><description><![CDATA[
<p>Last I checked there were inacuracies. I am not sure if they have been addressed!</p>
]]></description><pubDate>Wed, 03 Jun 2026 21:25:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=48390304</link><dc:creator>josevalim</dc:creator><comments>https://news.ycombinator.com/item?id=48390304</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48390304</guid></item><item><title><![CDATA[New comment by josevalim in "Elixir v1.20: Now a gradually typed language"]]></title><description><![CDATA[
<p>> some stuff being sold as "all these libs/packages that haven't had any updates for over a year is fine because Elixir" I just don't buy it<p>I maintain more than 20 packages and, except for the major ones, like Phoenix and Ecto, they haven't been updated in more than a year and yes, they are all fine.<p>The language has been extremely stable. There has been almost no breaking changes in over a decade. Case in point: we introduced a whole gradual type system without making any changes to the language surface! The language is still on v1.x!</p>
]]></description><pubDate>Wed, 03 Jun 2026 21:21:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=48390252</link><dc:creator>josevalim</dc:creator><comments>https://news.ycombinator.com/item?id=48390252</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48390252</guid></item><item><title><![CDATA[New comment by josevalim in "Elixir v1.20: Now a gradually typed language"]]></title><description><![CDATA[
<p>The syntax you are commenting on has always existed in Elixir, before v1.0, as part of patterns and guards.<p>You are commenting as if we added this now but we have made no changes to the language surface. The difference is that we now leverage these same language constructs to extract precise type information.</p>
]]></description><pubDate>Wed, 03 Jun 2026 20:27:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=48389507</link><dc:creator>josevalim</dc:creator><comments>https://news.ycombinator.com/item?id=48389507</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48389507</guid></item><item><title><![CDATA[New comment by josevalim in "What years of production-grade concurrency teaches us about building AI agents"]]></title><description><![CDATA[
<p>The team that built Erlang (Joe, Robert, Mike, and Bjorn) didn't know the actor model was actually a thing. They wanted to build reliable distributed systems and came up with the isolated processes model you find in Erlang today. Eventually (probably when Erlang was open sourced?), folks connected the dots that the actor model was the most accurate description of what was going on!</p>
]]></description><pubDate>Thu, 19 Feb 2026 05:19:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=47070206</link><dc:creator>josevalim</dc:creator><comments>https://news.ycombinator.com/item?id=47070206</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47070206</guid></item><item><title><![CDATA[New comment by josevalim in "Type inference of all constructs and the next 15 months"]]></title><description><![CDATA[
<p>Hard to say, as it really depends on what goes wrong. In practice we would likely need to make different trade-offs (for example, do less inference).</p>
]]></description><pubDate>Fri, 09 Jan 2026 22:21:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=46560247</link><dc:creator>josevalim</dc:creator><comments>https://news.ycombinator.com/item?id=46560247</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46560247</guid></item><item><title><![CDATA[Type inference of all constructs and the next 15 months]]></title><description><![CDATA[
<p>Article URL: <a href="https://elixir-lang.org/blog/2026/01/09/type-inference-of-all-and-next-15/">https://elixir-lang.org/blog/2026/01/09/type-inference-of-all-and-next-15/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=46557923">https://news.ycombinator.com/item?id=46557923</a></p>
<p>Points: 14</p>
<p># Comments: 2</p>
]]></description><pubDate>Fri, 09 Jan 2026 19:18:09 +0000</pubDate><link>https://elixir-lang.org/blog/2026/01/09/type-inference-of-all-and-next-15/</link><dc:creator>josevalim</dc:creator><comments>https://news.ycombinator.com/item?id=46557923</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46557923</guid></item><item><title><![CDATA[New comment by josevalim in "Lazier Binary Decision Diagrams for set-theoretic types"]]></title><description><![CDATA[
<p>Correct, I pushed a fix, should be live soon! Thank you!</p>
]]></description><pubDate>Tue, 02 Dec 2025 18:05:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=46124268</link><dc:creator>josevalim</dc:creator><comments>https://news.ycombinator.com/item?id=46124268</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46124268</guid></item><item><title><![CDATA[New comment by josevalim in "Lazier Binary Decision Diagrams for set-theoretic types"]]></title><description><![CDATA[
<p>You are right, poor phrasing on my side. Instead of focusing on C appearing twice, I should rather focus on how complex the expansion is, meaning that everytime we have to expand the BDD (which we need to do during subtyping or emptiness for example), we end-up doing a lot of repeated operations. I will push an update, thank you for commenting.</p>
]]></description><pubDate>Tue, 02 Dec 2025 16:02:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=46122598</link><dc:creator>josevalim</dc:creator><comments>https://news.ycombinator.com/item?id=46122598</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46122598</guid></item><item><title><![CDATA[Improving web accessibility with trace-augmented generation]]></title><description><![CDATA[
<p>Article URL: <a href="http://tidewave.ai/blog/improving-web-accessibility-with-trace-augmented-generation">http://tidewave.ai/blog/improving-web-accessibility-with-trace-augmented-generation</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=46049170">https://news.ycombinator.com/item?id=46049170</a></p>
<p>Points: 5</p>
<p># Comments: 0</p>
]]></description><pubDate>Tue, 25 Nov 2025 18:43:09 +0000</pubDate><link>http://tidewave.ai/blog/improving-web-accessibility-with-trace-augmented-generation</link><dc:creator>josevalim</dc:creator><comments>https://news.ycombinator.com/item?id=46049170</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46049170</guid></item><item><title><![CDATA[New comment by josevalim in "Elixir 1.19"]]></title><description><![CDATA[
<p>LiveView was still before v1.0, hence the churn, but Phoenix itself did not introduce breaking changes since v1.0, released more than a decade ago. Our skeleton for new applications change, as best practices around web apps are still evolving, but it is completely up to you to migrate. As a reference point, most other web frameworks have gone through several major versions in the same time, changing how new apps are built but also breaking old ones.<p>The idea that Phoenix is also mostly macros does not hold in practice. Last time this came up, I believe less than 5% of Phoenix' public API turned out to be macros. You get this impression because the initial skeleton it generates has the endpoint and the router, which are macro heavy, but once you start writing the actual application logic, your context, your controllers, and templates are all regular functions.</p>
]]></description><pubDate>Thu, 16 Oct 2025 21:44:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=45611065</link><dc:creator>josevalim</dc:creator><comments>https://news.ycombinator.com/item?id=45611065</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45611065</guid></item></channel></rss>