<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: housecarpenter</title><link>https://news.ycombinator.com/user?id=housecarpenter</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 09 Apr 2026 02:05:48 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=housecarpenter" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by housecarpenter in "AI makes the easy part easier and the hard part harder"]]></title><description><![CDATA[
<p>The reason I don't spend the majority of my time in code review is that when I'm reviewing my teammates' code I trust that the code has already been substantially verified already by that teammate in the process of writing it and testing it. Like 90% verified already. I see code review as just one small stage in the verification process, not the whole of it.<p>The way I approach it, it's really more about checking for failures, rather than verifying success. Like a smoke test. I scan over the code and if anything stands out to me as wrong, I point it out. I don't expect to catch everything that's wrong, and indeed I don't (as demonstrated by the fact that other members of the team will review the code and find issues I didn't notice). When the code has failed review, that means there's definitely an issue, but when the code has passed review, my confidence that there are no issues is still basically the same as it was before, only a little bit higher. Maybe I'm doing it wrong, I don't know.<p>If I had to fully verify that the code was correct when reviewing, applying the same level of scrutiny that I apply to my own code when I'm writing, I feel like I'd spend much longer on it---a similar time to what I'd spend writing on it.<p>Now with LLM coding, I guess opinions will differ as to how far one needs to fully verify LLM-generated code. If you see LLMs as stochastic parrots without any "real" intelligence, you'll probably have no trust in them and you'll see the code generated by the LLM as being 0% verified, and so as the user of the LLM you then have to do a "review" which is really going from 0% to 100%, not 90% to 100% and so is a much more challenging task. On the other hand, if you see LLMs as genuine intelligences you'd expect that LLMs are verifying the code to some extent as they write it, since after all it's pretty dumb to write a bunch of code for somebody without checking that it works. So in that case, you might see the LLM-generated code as 90% verified already, just as if it was generated by a trusted teammate, and then you can just do your normal review process.</p>
]]></description><pubDate>Mon, 09 Feb 2026 11:08:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=46943959</link><dc:creator>housecarpenter</dc:creator><comments>https://news.ycombinator.com/item?id=46943959</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46943959</guid></item><item><title><![CDATA[New comment by housecarpenter in "A Crisis comes to Wordle: Reusing old words"]]></title><description><![CDATA[
<p>It's true that onomatopoeia isn't always a word, but in the particular case of "aah", I think that particular choice of letters is conventionalized enough that it is a word.</p>
]]></description><pubDate>Mon, 02 Feb 2026 11:58:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=46854991</link><dc:creator>housecarpenter</dc:creator><comments>https://news.ycombinator.com/item?id=46854991</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46854991</guid></item><item><title><![CDATA[New comment by housecarpenter in "Size of Life"]]></title><description><![CDATA[
<p>From Wikipedia:<p>"The exact location of Hyperion is nominally secret but is available via internet search.[12] However, in July 2022, the Redwood Park superintendent closed the entire area around the tree, citing "devastation of the habitat surrounding Hyperion" caused by visitors. Its base was trampled by the overuse and as a result ferns no longer grow around the tree.[13]<p>Measures to protect the Hyperion tree were officially implemented in 2022 when the National Park Service (NPS) closed public access to its location in Redwood National Park.[14][15] Anyone who gets too close could face up to six months in jail and a $5,000 maximum fine.[13][16][17]"</p>
]]></description><pubDate>Thu, 11 Dec 2025 11:49:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=46230241</link><dc:creator>housecarpenter</dc:creator><comments>https://news.ycombinator.com/item?id=46230241</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46230241</guid></item><item><title><![CDATA[New comment by housecarpenter in "A new bridge links the math of infinity to computer science"]]></title><description><![CDATA[
<p>My impression (as a dilettante programmer without relevant credentials) is that there isn't really any question about whether mathematical structures <i>can be</i> rooted in set theory, or <i>can be</i> expressed as extensions of set theory. Disputes about foundations of mathematics are more about how easy or elegant it is to do so. (And in fact my impression is they're mostly about subjective, aesthetic considerations of elegance rather than practical considerations of how hard it is to do something in practice, even though the discussion tends to be nominally about the practical side. Quite similar to disputes about programming languages in that respect.)</p>
]]></description><pubDate>Wed, 26 Nov 2025 13:48:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=46057360</link><dc:creator>housecarpenter</dc:creator><comments>https://news.ycombinator.com/item?id=46057360</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46057360</guid></item><item><title><![CDATA[New comment by housecarpenter in "Category Theory Illustrated – Natural Transformations"]]></title><description><![CDATA[
<p>Defining first-order logic doesn't really require set theory, but it does require some conception of natural numbers. Instead of saying there's an infinite set of variables, you can have a single symbol x and a mark *, and then you can say a variable is any string consisting of x followed by any number of marks. You can do the same thing with constants, relation symbols and function symbols. This does mean there can only be countably many of each type of symbol but for foundational purposes that's fine since each proof will only mention finitely many variables.<p>Allowing uncountably many symbols can be more convenient when you apply logic in other ways, e.g. when doing model theory, but from a foundational perspective when you're doing stuff like that you're not using the "base" logic but rather using the formalized version of logic that you can define within the set theory that you defined using the base logic.</p>
]]></description><pubDate>Thu, 02 Oct 2025 08:55:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=45447558</link><dc:creator>housecarpenter</dc:creator><comments>https://news.ycombinator.com/item?id=45447558</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45447558</guid></item><item><title><![CDATA[New comment by housecarpenter in "God created the real numbers"]]></title><description><![CDATA[
<p>My first thought on reading your comment was to disagree and say no, we can have the exact value of 1, because we can choose our system of units and so we can make the square a unit square by fiat.<p>A better way to dispute the unit square diagonal argument for the existence of sqrt(2) would be to argue that squares themselves are unphysical, since all measurements are imprecise and so we can't be sure that any two physical lengths or angles are exactly the same.<p>But actually, this argument can also be applied to 1 and other discrete quantities. Sure, if I choose the length of some specific ruler as my unit length, then I can be sure that ruler has length 1. But if I look at any other object in the world, I can never say that other object has length exactly 1, due to the imprecision of measurements. Which makes this concept of "length exactly 1" rather limited in usefulness---in that sense, it would be fair to say the exact value of 1 doesn't exist.<p>Overall I think 1, and the other integers, and even rational numbers via the argument of AIPendant about egg cartons, are straightforwardly physically real as measurements of discrete quantities, but for measurements of continuous quantities I think the argument about the unit square diagonal works to show that rational numbers are no more and no less physically real than sqrt(2).</p>
]]></description><pubDate>Sat, 30 Aug 2025 14:07:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=45074815</link><dc:creator>housecarpenter</dc:creator><comments>https://news.ycombinator.com/item?id=45074815</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45074815</guid></item><item><title><![CDATA[New comment by housecarpenter in "Unification (2018)"]]></title><description><![CDATA[
<p>Consider the identity function f, which just takes an argument and returns it unchanged, and has the polymorphic type a -> a, where a is a type variable. What's the type of f(f)?<p>Obviously, since f(f) = f it should be a -> a as well. But to infer it without actually evaluating it, using the standard Hindley-Milner algorithm, we reason as follows: the two f's can have different specific types, so we introduce a new type variable b. The type of the first f will be a substitution instance of a -> a, the type of the second f will be a substitution instance of b -> b. We introduce a new type variable c for the return type, and solve the equation (a -> a) = ((b -> b) -> c), using unification. This gives us the substitution {a = (b -> b), c = (b -> b)}, and so we see that the return type c is b -> b.<p>But if we use pattern matching rather than unification, the variables in one of the two sides of the equation (a -> a) = ((b -> b) -> c) are effectively treated as constants referring to atomic types, not variables. Now if we treat the variables on the left side as constants, i.e. we treat a as a constant, we have to match b -> b to the constant a, which is impossible; the type a is atomic, the type b -> b isn't. If we treat the variables on the right side as constants, i.e. we treat b and c as constants, then we have to match a to both b -> b and c, and this means our substitution will have to make b -> b and c equal, which is impossible given that c is an atomic type and b -> b isn't.</p>
]]></description><pubDate>Mon, 18 Aug 2025 14:42:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=44941172</link><dc:creator>housecarpenter</dc:creator><comments>https://news.ycombinator.com/item?id=44941172</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44941172</guid></item><item><title><![CDATA[New comment by housecarpenter in "Why are there so many rationalist cults?"]]></title><description><![CDATA[
<p>It would surprise me if most rationalists didn't know who Jaynes was. I first heard of him via rationalists. The Sequences talk about him in adulatory tones. I think Yudkowsky would acknowledge him as one of his greatest influences.</p>
]]></description><pubDate>Wed, 13 Aug 2025 10:34:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=44886738</link><dc:creator>housecarpenter</dc:creator><comments>https://news.ycombinator.com/item?id=44886738</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44886738</guid></item><item><title><![CDATA[New comment by housecarpenter in "Writing a good design document"]]></title><description><![CDATA[
<p>What do you find surprising---the fact that it doesn't come out red, or the fact that people are confused by this behaviour?</p>
]]></description><pubDate>Tue, 05 Aug 2025 10:41:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=44796430</link><dc:creator>housecarpenter</dc:creator><comments>https://news.ycombinator.com/item?id=44796430</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44796430</guid></item><item><title><![CDATA[New comment by housecarpenter in "A list is a monad"]]></title><description><![CDATA[
<p>At least in my country (the UK), people generally do not learn abstract algebra in high school. That's a university-level topic.<p>I think there is a definite "step up" in complexity between the structures of abstract algebra such as monoids, rings, groups and vector spaces, and monads. All of those algebraic structures are basically just sets equipped with operations satisfying some equations. Monads are endofunctors equipped with natural transformations satisfying some equations. "Endofunctor" and "natural transformation" are considerably more advanced and abstract concepts than "set" and "operation", and they are concepts that belong to category theory (so I don't see how you can read and understand the definition of a monad without that basic level of category theory).<p>Your time estimates also seem wildly optimistic. A common rule of thumb is that reading a maths textbook at your level takes around an hour per page. I think the definition of a monad can be compared to one page of a textbook. So I'd say it'll take on the order of hours to read and understand the definition of a monad, and that's assuming you're already entirely comfortable with the pre-requisite concepts (natural transformations, etc.)</p>
]]></description><pubDate>Thu, 03 Jul 2025 14:27:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=44455412</link><dc:creator>housecarpenter</dc:creator><comments>https://news.ycombinator.com/item?id=44455412</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44455412</guid></item><item><title><![CDATA[New comment by housecarpenter in "A list is a monad"]]></title><description><![CDATA[
<p>It is a particular sense of "nondeterminism", but it's not specific to functional programming, I think it's the usual one theoretical CS as a whole. It's the same sense in which "nondeterminism" is used in P vs NP, for example.<p>Think of a computation as a process of changing state. At a given point in time, the computer is in a certain state, the current state. The computation can be described in terms of a function that acts on the current state.<p>In a deterministic computation, the function takes in the current state, and produces a single state as output which will be the state the computer enters on the next tick.<p>In a non-deterministic computation, the function takes in the current state and produces a <i>set</i> of states as output. These states are all the possible states the computer might enter on the next tick. We don't know (or just don't care) <i>which one</i> of these states it will enter.<p>You can <i>model</i> a non-deterministic computation as a deterministic one, by using a list `currentStates` to store the set of all <i>possible</i> current states of the computation. At each "tick", you do `currentStates = flatMap(nextStates, currentStates)` to "progress" the computation. In the end `currentStates` will be the set of all possible end states (and you could do some further processing to choose a specific end state, e.g. at random, if you wish, but you could also just work with the set of end states as a whole).<p>It's in this sense that "a list is a non-deterministic result", although this is really just one thing a list can represent; a list is a generic data structure which can represent all sorts of things, one of which is a non-deterministic result.</p>
]]></description><pubDate>Thu, 03 Jul 2025 11:24:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=44453876</link><dc:creator>housecarpenter</dc:creator><comments>https://news.ycombinator.com/item?id=44453876</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44453876</guid></item><item><title><![CDATA[New comment by housecarpenter in "First methane-powered sea spiders found crawling on the ocean floor"]]></title><description><![CDATA[
<p>As a non-arachnophobe, I don't find spiders of any kind to be cute. But I also don't find anything about their appearance or behaviour to be unpleasant or scary. They're just aesthetically unremarkable. Similar to, say, fish---I don't think most people will look at a fish and think either "ooh, so cute" or "weird alien thing, get it away from me", they just see a fish and don't really have any emotions about it.</p>
]]></description><pubDate>Tue, 24 Jun 2025 11:21:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=44364933</link><dc:creator>housecarpenter</dc:creator><comments>https://news.ycombinator.com/item?id=44364933</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44364933</guid></item><item><title><![CDATA[New comment by housecarpenter in "Interviewing a software engineer who prepared with AI"]]></title><description><![CDATA[
<p>As somebody with autism, one thing I'd say from my experience (I don't know how many people will agree) is that interviewing has felt like a much more severe stress test of my soft skills than anything I've had to do while actually being employed. While employed, the vast majority of my social interactions are oriented around some technical task that I need to work on with other people, and conveying information effectively so as to bring about the completion of this task. This is precisely the kind of social interaction that I feel most competent in--I feel like I'm pretty good at it, actually! What I struggle with are social interactions that are more open-ended, that are more about emotional connections and getting people to like you, and I feel like interviewing is an interaction of the latter type.<p>In this respect interviewing is a bit like LeetCode. LeetCode problems and writing code to satisfy business requirements are both "coding" but they're quite different kinds of coding; someone being able to do the former is probably good evidence they can do the latter, but there are also plenty of people who can do the latter without being able to do the former. So it is, in my view, with interviewing vs. interacting with people on the job.</p>
]]></description><pubDate>Tue, 08 Apr 2025 11:12:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=43620352</link><dc:creator>housecarpenter</dc:creator><comments>https://news.ycombinator.com/item?id=43620352</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43620352</guid></item><item><title><![CDATA[New comment by housecarpenter in "Solving SICP"]]></title><description><![CDATA[
<p>I think the author made a typo, and they actually meant to refer to 2.92, not 2.29. The table preceding the part mentioning 2.29 only includes 2.92. And 2.29 doesn't include the text "This is not easy!”, whereas 2.92 does.</p>
]]></description><pubDate>Wed, 05 Mar 2025 16:39:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=43268934</link><dc:creator>housecarpenter</dc:creator><comments>https://news.ycombinator.com/item?id=43268934</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43268934</guid></item><item><title><![CDATA[New comment by housecarpenter in "The number line freaks me out (2016)"]]></title><description><![CDATA[
<p>> it is absolutely completely impossible to randomly put a dot down on a number line and have it be pi<p>It's not impossible, it just has zero probability of occurring.</p>
]]></description><pubDate>Wed, 19 Feb 2025 07:29:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=43099579</link><dc:creator>housecarpenter</dc:creator><comments>https://news.ycombinator.com/item?id=43099579</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43099579</guid></item><item><title><![CDATA[New comment by housecarpenter in "The number line freaks me out (2016)"]]></title><description><![CDATA[
<p>An spoken English sentence is a finite string of phonemes. The set of allowable phonemes is finite. Given a finite set X, the set of all finite strings of elements of X is countable.<p>(The latter statement holds because for any given n, the set X_n of all strings of length n is finite. So you can count the members of X_0, then count the members of X_1, and so on, and by continuing on in that way you'll eventually count out all members of X. You never run out of numbers to assign to the next set because at each point the set of numbers you've already assigned is finite (it's smaller in size than X_0, ..., X_n combined, for some n).<p>In fact, even if you allow countably infinitely many phonemes to be used, the X_n sets will still be countable, if not finite, and in that case their union is still countable: to see that, you can take enumerations of each set put them together as columns an a matrix. Even though the matrix is infinite in both dimensions, it has finite diagonals, so you can enumerate its cells by going a diagonal at a time, like this (the numbers reflect the cells' order in the numeration):<p><pre><code>    1  3  6  10 15
    2  5  9  14
    4  8  13
    7  12
    11
</code></pre>
However if you allow sentences to be countably infinitely long, then even when you only have finitely many phonemes, the set of all sentences will be uncountable, because in that case each countably infinitely long sentence can be mapped to a real number represented as an expansion in some base, and you can apply Cantor's diagonal argument. The "just count out each X_n separately" argument doesn't work in this case because it only applies to the sentences of finite length.)</p>
]]></description><pubDate>Wed, 19 Feb 2025 06:57:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=43099360</link><dc:creator>housecarpenter</dc:creator><comments>https://news.ycombinator.com/item?id=43099360</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43099360</guid></item><item><title><![CDATA[New comment by housecarpenter in "“A Course of Pure Mathematics” – G. H. Hardy (1921) [pdf]"]]></title><description><![CDATA[
<p>What do you mean by "the use of the Least Upper Bound"?</p>
]]></description><pubDate>Tue, 31 Dec 2024 11:32:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=42558094</link><dc:creator>housecarpenter</dc:creator><comments>https://news.ycombinator.com/item?id=42558094</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42558094</guid></item><item><title><![CDATA[New comment by housecarpenter in "How did you do on the AI art Turing test?"]]></title><description><![CDATA[
<p>Can you elaborate on why?</p>
]]></description><pubDate>Sat, 23 Nov 2024 15:42:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=42221458</link><dc:creator>housecarpenter</dc:creator><comments>https://news.ycombinator.com/item?id=42221458</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42221458</guid></item><item><title><![CDATA[New comment by housecarpenter in "Why Haskell?"]]></title><description><![CDATA[
<p>Technically, `a :: Num` would be <i>declaring</i>, or <i>defining</i> that `a` is of type `Num`. After you see `a :: Num`, you can assume from then on as you're reading the program that `a` has type `Num`; if something is incompatible with that assumption it will result in a compiler error. This is different from `Num a`, which is making the assertion that `a` is of type `Num`, but that assertion may evaluate as true or false. It's similar to how assignment is different from equality, so that most programming languages with C-style syntax make a distinction between `=` and `==`.<p>There's also the fact that `Num` is technically not a type, but a type <i>class</i>, which is like a level above a type: values are organized into types, and types are organized into classes. Though this is more of a limitation of Haskell: conceptually, type classes are just the types of types, but in practice, the way they're implemented means they can't be treated in a uniform way with ordinary types.<p>So that's why there's a syntactic distinction between `Num a` and `a :: Num`. As for why `Num` comes before `a`, there's certainly a reasonable argument for making it come after, given that we'd read it in English as "a is a Num". I think the reason it comes before is that it's based on the usual function call syntax, which is `f x` in Haskell (similar to `f(x)` in C-style languages, but without requiring the parentheses). `Num` is kind of like a function you call on a type which returns a boolean.</p>
]]></description><pubDate>Thu, 12 Sep 2024 15:00:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=41521736</link><dc:creator>housecarpenter</dc:creator><comments>https://news.ycombinator.com/item?id=41521736</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41521736</guid></item><item><title><![CDATA[New comment by housecarpenter in "Making database systems usable"]]></title><description><![CDATA[
<p>As I understand it, the main advantage of having separate CUSTOMER and ORDER tables rather than just have a field on CUSTOMER which is a list of order IDs is that the latter structure makes it easy for someone querying the database to retrieve a list of order IDs for a given customer ID (just look up the value of the list-of-order-IDs field), but difficult to retrieve the customer ID for a given order ID (one would have to go through each customer and search through the list-of-order-IDs field for a match). The former structure, on the other hand, makes both tasks trivial to do with a JOIN.</p>
]]></description><pubDate>Thu, 22 Aug 2024 12:35:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=41319568</link><dc:creator>housecarpenter</dc:creator><comments>https://news.ycombinator.com/item?id=41319568</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41319568</guid></item></channel></rss>