Hacker News

Top stories

Live mirror
30 storiesupdated just nowView source snapshot
  1. "They had no concept of a duty of care to their users." (aresluna.org)
    51comments
  2. In an $80 Motel Room, a Discovery to Shed Light on the Origins of Life (nytimes.com)
    13comments
  3. Replacing the old battery on rechargeable bike lights (jvns.ca)
    13comments
  4. Font where each token is equal-width (twitter.com/amplifiedamp)
    1comments
  5. 10 Tells of a Slop UI (hereticpleb.vercel.app)
    75comments
  6. Flip Fluid on Flip Dots (mitxela.com)
    16comments
  7. Fakecloud: Local AWS cloud emulator for integration tests (fakecloud.dev)
    15comments
  8. Writing Efficient C++ Code (asawicki.info)
    1comments
  9. Ten Lines of Code That Changed My World (pixelambacht.nl)
    —discuss
  10. Does Georgism work? Five years later (astralcodexten.com)
    342comments
  11. Unsealed Briefs in Authors’ Case v. Microsoft/OpenAI (authorsguild.org)
    455comments
  12. Go Concurrency Distilled (antonz.org)
    133comments
  13. Finally, A True Blue Rose Exists (sciencenews.org)
    23comments
  14. Show HN: A CC0 museum of retro 3D tricks you can paste into a page (3d-retro.com)
    4comments
  15. PipePipe: NewPipe hard fork implementing SponsorBlock (github.com/infinityloop1308)
    249comments
  16. Rusty thoughts on "Parse, don't validate" (thegreenplace.net)
    7comments
  17. The internet discovers TLA+. Now what? (reasonable.io)
    38comments
  18. DeepSeek Elastic Compute (DSec) (arxiv.org)
    94comments
  19. Show HN: Reladraw – A diagram language where you decide where to place things (github.com/reladraw)
    93comments
  20. "As a Language Model": Chat Template Switches LLM Self-Referential Voice (arxiv.org)
    86comments
  21. ASML says it sold 'absolutely nothing' in Europe in 2026 (tomshardware.com)
    773comments
  22. Biology might not be quantum, but its math is quantumlike (quantamagazine.org)
    39comments
  23. A searchable library of forgotten public-domain film clips from 1915 onward (movingimagearchive.com)
    26comments
  24. Fifteen years later, the Apple Cards origin story (lexontech.org)
    109comments
  25. An agent used DNS to reach an external chatbot (alignment.openai.com)
    136comments
  26. How I changed teaching after AI managed to do all my homework assignments (thelastsoftwareengineer.substack.com)
    243comments
  27. Exploding variance of means of exponentials: least-squares to the rescue (francisbach.com)
    —discuss
  28. Promising discoveries about the potential for life on one of Saturn’s icy moons (fu-berlin.de)
    48comments
  29. Accelerated Out of Core Shuffling (quasiben.github.io)
    —discuss
  30. Meta Blocks President Lula's Facebook Page, Campaign Ads 2 Weeks from Election (reddit.com)
    250comments

Rusty thoughts on "Parse, don't validate"

34 pointsby 6h agoeli.thegreenplace.net
7 comments
1h agoHN ↗

Good article on Rust's strengths with types. If you like this, you may be curious how you might build your own parse capabilities. I like the Rust crates Winnow and Nom, and also the Rust traits From and Into.

1h agoHN ↗

Nonempty type wrappers are a stark reminder that we are missing out on refinement types.

52m agoHN ↗

I was thinking about its implementation, too, and ended up deciding that it was probably a performance optimization.

`Vec<T>` stores all data on the heap, so getting anything out of it involves a pointer deref and possibly also an array bounds check. This `NonEmpty<T>` type keeps the first element of the list in a location that supports some low-level optimization that might make a significant difference in situations where accessing the first element is much more common than accessing subsequent elements.

51m agoHN ↗

Rust has a proposal for this, in the form of pattern types. It's on nightly, but quite far from being ready for prime time.

1h agoHN ↗

This is great. Alexis King actually stated that, had she known how popular “Parse, Don’t Validate” had been, she would have written it in a language more widely used than Haskell.

39m agoHN ↗

With its rich type system, Haskell is the perfect language to demonstrate the dictum.

32m agoHN ↗

Another take, from the primary example: This is what `unwrap()` is for. I understand that the author is looking at this from a correctness and safety(?) perspective. For practical purposes, I would unwrap here. If it's less trivial than the example, unwrap with a comment explaining why it's fine.

Another angle: Unfortunately, the `first()` method being fallible here is just an issue of using an imperfect method/datatype here. This is where the author gets in to a non-empty-vec custom type. Then you are balancing using a more correct type that takes custom wiring vs a std lib thing everyone understands and takes no setup. I would lean towards this setup if I were using this non_empty_vec.first() unwrap pattern a number of times in the code base; then the setup would be worth it, at least for my own code bases. If I were exposing this in a lib others would use, I would keep the standard Vec so as to be more transparent for others.

In both views: "This is what unwrap is for" does it for me in all cases I've encountered to date. Maybe for aerospace or safety critical systems, I would have a different take.

A third take: I notice this trend in the rust community. It's not my cup of tea. Keep things simple, easy to maintain, and don't let "correctness" get in the way. In this example, I don't think it gets in the way, but I have seen this mindset lead to it getting in the way, especially in embedded, where mapping the Owernership model to hardware ends up in messy patterns and surprising assertions about embedded-101 concepts like DMA being "unsolved", "no good way", "difficult" etc.

Rust provides tools to make sure specific logic is correct if it passes the compiler. People sometimes go overboard and assume you have to type-maxx your code, regardless of complexity added by doing so.