frontpage.
newsnewestaskshowjobs

Made with ♥ by @iamnishanth

Open Source @Github

fp.

Open in hackernews

Parse, Don't Validate and Type-Driven Design in Rust

https://www.harudagondi.space/blog/parse-dont-validate-and-type-driven-design-in-rust/
59•todsacerdoti•2h ago

Comments

dang•1h ago
Recent and related: Parse, Don't Validate (2019) - https://news.ycombinator.com/item?id=46960392 - Feb 2026 (172 comments)

also:

Parse, Don’t Validate – Some C Safety Tips - https://news.ycombinator.com/item?id=44507405 - July 2025 (73 comments)

Parse, Don't Validate (2019) - https://news.ycombinator.com/item?id=41031585 - July 2024 (102 comments)

Parse, don't validate (2019) - https://news.ycombinator.com/item?id=35053118 - March 2023 (219 comments)

Parse, Don't Validate (2019) - https://news.ycombinator.com/item?id=27639890 - June 2021 (270 comments)

Parsix: Parse Don't Validate - https://news.ycombinator.com/item?id=27166162 - May 2021 (107 comments)

Parse, Don’t Validate - https://news.ycombinator.com/item?id=21476261 - Nov 2019 (230 comments)

Parse, Don't Validate - https://news.ycombinator.com/item?id=21471753 - Nov 2019 (4 comments)

(p.s. these links are just to satisfy extra-curious readers - no criticism is intended! I add this because people sometimes assume otherwise)

jaggederest•1h ago
You can go even further with this in other languages, with things like dependent typing - which can assert (among other interesting properties) that, for example, something like

    get_elem_at_index(array, index)
cannot ever have index outside the bounds of the array, but checked statically at compilation time - and this is the key, without knowing a priori what the length of array is.

"In Idris, a length-indexed vector is Vect n a (length n is in the type), and a valid index into length n is Fin n ('a natural number strictly less than n')."

Similar tricks work with division that might result in inf/-inf, to prevent them from typechecking, and more subtle implications in e.g. higher order types and functions

VorpalWay•1h ago
How does that work? If the length of the array is read from stdin for example, it would be impossible to know it at compile time. Presumably this is limited somehow?
jaggederest•1h ago
If the length is read from outside the program it's an IO operation, not a static variable, but there are generally runtime checks in addition to the type system. Usually you solve this as in the article, with a constructor that checks it - so you'd have something like "Invalid option: length = 5 must be within 0-4" when you tried to create the Fin n from the passed in value
ratorx•59m ago
It doesn’t have to be a compile time constant. An alternative is to prove that when you are calling the function the index is always less than the size of the vector (a dynamic constraint). You may be able to assert this by having a separate function on the vector that returns a constrained value (eg. n < v.len()).
mdm12•56m ago
One option is dependent pairs, where one value of the pair (in this example) would be the length of the array and the other value is a type which depends on that same value (such as Vector n T instead of List T).

Type-Driven Development with Idris[1] is a great introduction for dependently typed languages and covers methods such as these if you're interested (and Edwin Brady is a great teacher).

[1] https://www.manning.com/books/type-driven-development-with-i...

marcosdumay•39m ago
If you check that the value is inside the range, and execute some different code if it's not, then congratulations, you now know at compile time that the number you will read from stdin is in the right range.
dernett•37m ago
Not sure about Idris, but in Lean `Fin n` is a struct that contains a value `i` and a proof that `i < n`. You can read in the value `n` from stdin and then you can do `if h : i < n` to have a compile-time proof `h` that you can use to construct a `Fin n` instance.
esafak•6m ago
I wish dependent types were more common :(
cmovq•1h ago
Dividing a float by zero is usually perfectly valid. It has predictable outputs, and for some algorithms like collision detection this property is used to remove branches.
woodruffw•1h ago
I think “has predictable outputs” is less valuable than “has expected outputs” for most workloads. Dividing by zero almost always reflects an unintended state, so proceeding with the operation means compounding the error state.

(This isn’t to say it’s always wrong, but that having it be an error state by default seems very reasonable to me.)

cmovq•37m ago
It’s more so that dividing by zero is not an error in IEE754, so it would be more unexpected to have your float divide operator return a Option<f32>
noitpmeder•1h ago
This reminds me a bit of a recent publication by Stroustrup about using concepts... in C++ to validate integer conversions automatically where necessary.

https://www.stroustrup.com/Concept-based-GP.pdf

  {
     Number<unsigned int> ii = 0;
     Number<char> cc = '0';
     ii = 2; // OK
     ii = -2; // throws
     cc = i; // OK if i is within cc’s range
     cc = -17; // OK if char is signed; otherwise throws
     cc = 1234; // throws if a char is 8 bits
  }
strawhatguy•59m ago
The alternative is one type, with many functions that can operate on that type.

Like how clojure basically uses maps everywhere and the whole standard library allows you to manipulate them in various ways.

The main problem with the many type approach is several same it worse similar types, all incompatible.

packetlost•56m ago
I don't really get why this is getting flagged, I've found this to be true but more of a trade off than a pure benefit. It also is sort of besides the point: you always need to parse inputs from external, usually untrusted, sources.
doublesocket•52m ago
Agree with this. Mismatching types are generally an indicator of an underlying issue with the code, not the language itself. These are areas AI can be helpful flagging potential problems.
fiddlerwoaroof•50m ago
Yeah, there's something of a tension between the Perlis quote "It is better to have 100 functions operate on one data structure than 10 functions on 10 data structures" and Parse, don't validate.

The way I've thought about it, though, is that it's possible to design a program well either by encoding your important invariants in your types or in your functions (especially simple functions). In dynamically typed languages like Clojure, my experience is that there's a set of design practices that have a lot of the same effects as "Parse, Don't Validate" without statically enforced types. And, ultimately, it's a question of mindset which style you prefer.

strawhatguy•33m ago
There's probably a case for both. Core logic might benefit from hard types deep in the bowels of unchanging engine.

The real world often changes though, and more often than not the code has to adapt, regardless of how elegant are systems are designed.

marcosdumay•42m ago
There are more than two alternatives, since functions can operate in more than one type.
Rygian•32m ago
This sounds like the "stringly typed language" mockery of some languages. How is it actually different?
sam0x17•56m ago
btw the “quoth” crate makes it really really easy to implement scannerless parsing in rust for arbitrary syntax, use it on many of my projects
IshKebab•11m ago
Interesting looking crate. You don't seem to have any examples at all though so I wouldn't say it makes it easy!
hutao•14m ago
Note that the division-by-zero example used in this article is not the best example to demonstrate "Parse, Don't Validate," because it relies on encapsulation. The principle of "Parse, Don't Validate" is best embodied by functions that transform untrusted data into some data type which is correct by construction.

Alexis King, the author of the original "Parse, Don't Validate" article, also published a follow-up, "Names are not type safety" [0] clarifying that the "newtype" pattern (such as hiding a nonzero integer in a wrapper type) provide weaker guarantees than correctness by construction. Her original "Parse, Don't Validate" article also includes the following caveat:

> Use abstract datatypes to make validators “look like” parsers. Sometimes, making an illegal state truly unrepresentable is just plain impractical given the tools Haskell provides, such as ensuring an integer is in a particular range. In that case, use an abstract newtype with a smart constructor to “fake” a parser from a validator.

So, an abstract data type that protects its inner data is really a "validator" that tries to resemble a "parser" in cases where the type system itself cannot encode the invariant.

The article's second example, the non-empty vec, is a better example, because it encodes within the type system the invariant that one element must exist. The crux of Alexis King's article is that programs should be structured so that functions return data types designed to be correct by construction, akin to a parser transforming less-structured data into more-structured data.

[0] https://lexi-lambda.github.io/blog/2020/11/01/names-are-not-...

fph•12m ago
The article quickly mentions implementing addition:

```

impl Add for NonZeroF32 { ... }

impl Add<f32> for NonZeroF32 { ... }

impl Add<NonZeroF32> for f32 { ... }

```

What type would it return though?

Inferno

https://en.wikipedia.org/wiki/Inferno_(operating_system)
1•tosh•27s ago•0 comments

The Kingkiller Chronicles Completion Using LLMs

https://thethirdsilence.com/
1•Geobond•29s ago•0 comments

NSA and IETF, Part 6

https://blog.cr.yp.to/20260221-structure.html
2•Tomte•2m ago•0 comments

I built an app to organize web links like collections. Would love feedback

https://linkits.xyz
2•max_cm•2m ago•1 comments

SB26-051 Age Attestation on Computing Devices – Colorado General Assembly

https://leg.colorado.gov/bills/SB26-051
2•bilsbie•4m ago•0 comments

Happy Zelda's 40th first LLM running on N64 hardware (4MB RAM, 93MHz)

https://github.com/sophiaeagent-beep/n64llm-legend-of-Elya
2•AutoJanitor•4m ago•0 comments

Ask HN: Programmable Watches with WiFi?

1•dakiol•4m ago•0 comments

RIP Willie Colón (salsa legend)

https://www.billboard.com/music/latin/willie-colon-dead-reactions-latin-music-stars-1236184469/
1•pauseandplay•4m ago•0 comments

Show HN: Claw Drive – Open-source AI file manager that auto-organizes your files

https://github.com/dissaozw/claw-drive
1•dissao_zw•6m ago•0 comments

Password managers less secure than promised

https://ethz.ch/en/news-and-events/eth-news/news/2026/02/password-managers-less-secure-than-promi...
2•mono-bob•9m ago•0 comments

Graph Topology and Battle Royale Mechanics

https://blog.lukesalamone.com/posts/beam-search-graph-pruning/
2•salamo•11m ago•0 comments

Intense sunlight reduces plant diversity and biomass across global grasslands

https://phys.org/news/2026-02-intense-sunlight-diversity-biomass-global.html
1•PaulHoule•11m ago•0 comments

So what about the students and people in college?

1•tbirch•13m ago•0 comments

Epstein Financial Forensics: Automated Financial Reconstruction from EFTA

https://github.com/randallscott25-star/epstein-forensic-finance
3•timkq•15m ago•0 comments

Show HN: MeMCP – MCP for Personal Profile

https://github.com/nickyreinert/meMCP
1•y42•15m ago•0 comments

‘Dictator vibes' as dear leader Trump puts name and face front and center

https://www.theguardian.com/us-news/2026/feb/21/trump-name-face-justice-department
1•gizzlon•16m ago•1 comments

When Code is Free, Why is Claude is an Electron app?

https://www.dbreunig.com/2026/02/21/why-is-claude-an-electron-app.html
2•dbreunig•16m ago•0 comments

What If Our Websites Lost Their Soul? (I Tried to Get It Back)

https://thetechtipsss.blogspot.com/2026/02/what-if-our-websites-lost-their-soul-i.html
2•Traumen•17m ago•0 comments

Reader – web scraping that outputs clean Markdown for LLMs

https://github.com/vakra-dev/reader
1•nihalwashere•18m ago•1 comments

The Big List of Naughty Strings

https://github.com/minimaxir/big-list-of-naughty-strings
2•shirian•18m ago•0 comments

Swift System Metrics 1.0: Process-Level Monitoring

https://www.swift.org/blog/swift-system-metrics-1.0-released/
1•frizlab•20m ago•0 comments

Tim O'Reilly – Why AI Needs Us

https://timoreilly.substack.com/p/why-ai-needs-us
1•rmason•20m ago•0 comments

CoreWeave's stock drops. Why a $4B Blue Owl funding snag has investors on edge

https://www.marketwatch.com/story/coreweaves-stock-drops-why-a-4-billion-blue-owl-funding-snag-ha...
1•zerosizedweasle•22m ago•0 comments

Chained Bugs to Leak Victim's Uber's FB OAuth Token

https://hackerone.com/reports/202781
1•onw•22m ago•0 comments

Show HN: CodeFossils – Discover abandoned GitHub repos worth reviving

https://www.codefossils.com/
1•ahmethedev•27m ago•0 comments

Engineers build motor-doping racing-bicycle [YouTube] [video]

https://www.youtube.com/watch?v=ZdDHtLP3oEs
1•Ylpertnodi•28m ago•1 comments

ChatGPT agrees with you too much. I built an AI that pushes back

https://www.thetank.io/
1•schmommy•28m ago•1 comments

The Web is your Canvas – QuillMonkey

https://www.quillmonkey.com/
2•zerealshadowban•30m ago•0 comments

Musica Suite

https://musicasuite.it/
1•billyrudi•30m ago•0 comments

RationalGO – A Personal AI Agent Built as an OS (10% AI, 90% Engineering)

https://rationalgo.ai
1•gravitybrain•31m ago•0 comments