<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: cartoffal</title><link>https://news.ycombinator.com/user?id=cartoffal</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Wed, 22 Apr 2026 09:07:17 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=cartoffal" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by cartoffal in "Stringly Typed"]]></title><description><![CDATA[
<p>> I don’t know why the network would be any way special.<p>The network isn't special. This applies locally too. But the article we are commenting on (at least, _I_ was commenting on) is about the network, and it uses the phrase "type safety over the network" in particular.<p>> You parse/validate unstructured binary blobs into structured data, and what’s left _is type safety_.<p>That is in fact exactly what I said. The point is that at some point you started with unstructured binary blobs. As soon as data leaves the application, it is no longer "safe", and it is unsafe until it is ingested and (re)validated. So my point can be freely generalised to "type safety beyond the application boundary is a fiction". And the application boundary will always exist, whether you are working with a strongly or weakly, statically or dynamically typed language.</p>
]]></description><pubDate>Sun, 11 May 2025 12:52:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=43953461</link><dc:creator>cartoffal</dc:creator><comments>https://news.ycombinator.com/item?id=43953461</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43953461</guid></item><item><title><![CDATA[New comment by cartoffal in "Stringly Typed"]]></title><description><![CDATA[
<p>In many statically-typed languages, types do not exist at runtime - they are erased once the program is known to be internally consistent. What is left is not type safety, it is parsing <i>and validation</i> of unstructured binary blobs (or arbitrary strings, depending on the protocol) into structured data. Structure and types are not the same thing, and in many languages they barely even overlap.</p>
]]></description><pubDate>Thu, 08 May 2025 10:30:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=43924852</link><dc:creator>cartoffal</dc:creator><comments>https://news.ycombinator.com/item?id=43924852</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43924852</guid></item><item><title><![CDATA[New comment by cartoffal in "Stringly Typed"]]></title><description><![CDATA[
<p>My point was more that the layers below the application will also have to parse the data into a particular format - in the case of networked applications, into TCP/IP packets, then anything particular to the message protocol, before hitting the application. And <i>then</i> the application will, at runtime (regardless of whether you are using a type safe language or not) have to parse and validate the shape of the data before it can be used.</p>
]]></description><pubDate>Thu, 08 May 2025 10:28:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=43924846</link><dc:creator>cartoffal</dc:creator><comments>https://news.ycombinator.com/item?id=43924846</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43924846</guid></item><item><title><![CDATA[New comment by cartoffal in "Stringly Typed"]]></title><description><![CDATA[
<p>The idea of "type safety over the network" is a fiction.<p>When it comes down to it, what is being sent over the network is 1s and 0s. At some point, some layer (probably multiple layers) are going to have to interpret that sequence of 1s and 0s into a particular shape. There are two main ways of doing that:<p>- Know what format the data is in, but not the content (self-describing formats) - in which case the data you end up with might be of an arbitrary shape, and casting/interpreting the data is left to the application<p>- Know what format the data is in, AND know the content (non-self-describing formats) - in which case the runtime will parse out the data for you from the raw bits and you get to use it in its structured form.<p>The fact that this conversion happens doesn't depend on the language; JS is no more unsafe than any other language in this regard, and JSON is no better or worse of a data serialisation format for it. The boundary already exists, and <i>someone</i> has to handle what happens when the data is the wrong shape. Where that boundary ends up influences the shape of the application but what is preferable will depend on the application and developer.</p>
]]></description><pubDate>Wed, 07 May 2025 18:37:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=43919179</link><dc:creator>cartoffal</dc:creator><comments>https://news.ycombinator.com/item?id=43919179</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43919179</guid></item><item><title><![CDATA[New comment by cartoffal in "Flat origami is Turing complete (2023)"]]></title><description><![CDATA[
<p>Turing completeness and P completeness are completely different things. There is no sense in which P-completeness is a "more specific" version of Turing-completeness.</p>
]]></description><pubDate>Tue, 22 Apr 2025 10:38:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=43760693</link><dc:creator>cartoffal</dc:creator><comments>https://news.ycombinator.com/item?id=43760693</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43760693</guid></item><item><title><![CDATA[New comment by cartoffal in "Haskelling My Python"]]></title><description><![CDATA[
<p>> The $ operator is nothing but syntactic sugar that allows you to write bar $ foo data instead of having to write bar (foo data). That’s it.<p>Actually, it's even simpler than that: the $ operator is nothing but a function that applies its left argument to its right one! The full definition is<p><pre><code>    f $ x = f x
</code></pre>
(plus a directive that sets its precedence and association)</p>
]]></description><pubDate>Mon, 21 Apr 2025 13:42:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=43751931</link><dc:creator>cartoffal</dc:creator><comments>https://news.ycombinator.com/item?id=43751931</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43751931</guid></item><item><title><![CDATA[New comment by cartoffal in "Exeter's unassuming co-op worker leads double life as 'Lord of the Logos'"]]></title><description><![CDATA[
<p>The Co-op in Sandwich, Kent is still locally known as the Pioneer!</p>
]]></description><pubDate>Sun, 06 Apr 2025 09:42:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=43600194</link><dc:creator>cartoffal</dc:creator><comments>https://news.ycombinator.com/item?id=43600194</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43600194</guid></item><item><title><![CDATA[New comment by cartoffal in "Why does target="_blank" have an underscore in front? (2024)"]]></title><description><![CDATA[
<p>It wasn't easier, but it was <i>simpler</i>. Fewer moving parts.<p>The reason we moved away from it was that after a point, the amount of legwork to implement relatively simple behaviours became astronomical. Whether or not the current state of matters is "better", who's to say. But things are certainly much easier now.<p>Besides, you still can use those old modes if you want to :)</p>
]]></description><pubDate>Mon, 24 Feb 2025 17:18:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=43162125</link><dc:creator>cartoffal</dc:creator><comments>https://news.ycombinator.com/item?id=43162125</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43162125</guid></item><item><title><![CDATA[New comment by cartoffal in "Haskell: A Great Procedural Language"]]></title><description><![CDATA[
<p>> Understanding the map signature in Haskell is more difficult than any C construct.<p>This is obviously false. The map type signature is <i>significantly</i> easier to understand than pointers, referencing and dereferencing.<p>I am an educator in computer science - the former takes about 30-60 seconds to grok (even in Haskell, though it translates to most languages, and even the fully generalised fmap), but it is a rare student that fully understands the latter within a full term of teaching.</p>
]]></description><pubDate>Sun, 19 Jan 2025 16:30:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=42758476</link><dc:creator>cartoffal</dc:creator><comments>https://news.ycombinator.com/item?id=42758476</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42758476</guid></item><item><title><![CDATA[New comment by cartoffal in "What I Learned Failing to Finish a Game in 2024"]]></title><description><![CDATA[
<p>> Just imagine Vampire Survivors without sound or effects.<p>I can't help but feel that this completely undermines your point - Vampire Survivors is bashed together using rudimentary knockoffs of sprites from games from the 1990s, in an engine which barely supports the idea of particles let alone proper visual effects.* It is the gameplay that carries Vampire Survivors, not the aesthetic.<p>Game feel is of course essential to producing a good game all-round, but a competent game designer can and will tell the difference between a good game design and a bad one, way before polish and juice are layered on top.<p>*I don't say this as a criticism - Vampire Survivors is fantastic - but the idea that it's propped up by its look is just daft.</p>
]]></description><pubDate>Thu, 16 Jan 2025 13:06:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=42724610</link><dc:creator>cartoffal</dc:creator><comments>https://news.ycombinator.com/item?id=42724610</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42724610</guid></item><item><title><![CDATA[New comment by cartoffal in "Fold-... and Monoids"]]></title><description><![CDATA[
<p>> Here are some monoids: string-append over strings, addition over integers, state transition over machine states, compose over unary functions.<p>Correction: function composition is not a monoid over unary functions, only over families of endofunctions (functions of type `a -> a` for some `a`). You can't compose a function of type `a -> b` with a function of type `a -> b` for example, when `a` /= `b`, because one gives back a value of type `b` which cannot be passed into a function expecting a value of type `a`.</p>
]]></description><pubDate>Wed, 08 Jan 2025 11:40:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=42633170</link><dc:creator>cartoffal</dc:creator><comments>https://news.ycombinator.com/item?id=42633170</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42633170</guid></item></channel></rss>