<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: DanWaterworth</title><link>https://news.ycombinator.com/user?id=DanWaterworth</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 30 Apr 2026 21:41:42 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=DanWaterworth" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by DanWaterworth in "Ask HN: Who is hiring? (November 2018)"]]></title><description><![CDATA[
<p>Is there a way to apply without going through the angel.co website?</p>
]]></description><pubDate>Thu, 01 Nov 2018 20:38:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=18358186</link><dc:creator>DanWaterworth</dc:creator><comments>https://news.ycombinator.com/item?id=18358186</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=18358186</guid></item><item><title><![CDATA[New comment by DanWaterworth in "How Hillsong Church conquered the music industry"]]></title><description><![CDATA[
<p>You obviously have reasons to be angry, but vitriolic comments don't produce constructive discourse.</p>
]]></description><pubDate>Tue, 23 Oct 2018 18:04:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=18285787</link><dc:creator>DanWaterworth</dc:creator><comments>https://news.ycombinator.com/item?id=18285787</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=18285787</guid></item><item><title><![CDATA[New comment by DanWaterworth in "Rust RAII is better than the Haskell bracket pattern"]]></title><description><![CDATA[
<p>> I only mean it's visibly more obvious, you have an indented block...<p>Haskell is more similar than you realise, it's the difference between this:<p><pre><code>    withSomeResource $ \resource -> do
      someFunctionOn resource
</code></pre>
and this:<p><pre><code>    with some_resource() as resource:
        some_function_on(resource)
</code></pre>
> I'm not very familiar with Haskell but it seems like you'd get used to the type system telling you everything you need to know<p>As an outsider, you might expect a type-error to mean that you made a logic error, in practice it usually means you made a typo.<p>What happens is that the type system forces you to write things in a certain way. You internalize its rules and it moulds your style. You don't try random things until they stick, you write code expecting it to work and knowing why it should, just like you would in Python. It's just that more of your reasoning is being verified. "Verified" is the operative word here - the type system doesn't tell how to do anything.<p>> it seems like it's maybe quite unhaskellish to have to rely on a naming convention and remembering not to use the return value of the function?<p>The Python equivalent of the problem here would be:<p><pre><code>    current_resource = a_resource

    with some_resource() as resource:
        current_resource = resource

    current_resource.some_method()
</code></pre>
So it's not that using the return value of the withSomeResource function is a problem, it's the resource escaping from the scope where it is valid.<p>I think the crux of our discussion is about checked vs unchecked constraints.<p>When you work on (successful) large codebases, whether in a static or dynamically typed language, there are always rules about style (and I mean this in a broader way than how your code is laid out). For example, in large Python projects, there might be rules about when it is acceptable to monkey-patch. These rules make reasoning about the behaviour of these programs possible without having to read through everything.<p>Large Haskell projects also have these rules, but Haskellers like to enforce at least some of them using the type system. It takes effort to encode these rules in the type system and it is more difficult to write code that demonstrably follows the rules than implicitly follows them, but the reward for this effort is that it gives you some assurance that the rules are actually being followed everywhere.<p>For some rules this extra effort makes sense and other times it doesn't. The type system is just another way to communicate intent. Writing the best Haskell doesn't necessarily mean writing the most straight-jacketly typed Haskell, but it does give you that option. Beginners often fall into the trap of wanting to try out the new-and-shiny and making everything more strict than is helpful.<p>For one-man projects, there's really no advantage to Haskell over Python (with the caveat that you may not remember all of the intricacies of your code in six months and using Haskell you may have encoded more of your assumptions in the type system).</p>
]]></description><pubDate>Tue, 09 Oct 2018 17:41:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=18178096</link><dc:creator>DanWaterworth</dc:creator><comments>https://news.ycombinator.com/item?id=18178096</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=18178096</guid></item><item><title><![CDATA[New comment by DanWaterworth in "Rust RAII is better than the Haskell bracket pattern"]]></title><description><![CDATA[
<p>I can see why you might think that, being built into the language, using 'with' in Python in a broken way would be easier to spot. However, having used both languages extensively, I can tell you that, at least for me, there's no discernible difference.<p>I think the reason for this is might be that, in Haskell, a function starting with 'with' is, by convention, using the bracket pattern and the way that you might use such a function would be very similar in structure to the Python way.<p>Something that is often said about C++ is that, you're only ever using 10% of the language, but that everyone uses a different 10% and it's true, but it's true of every language to differing degrees. Everyone has their own way of forming programs, just like everyone has their own slightly different style of playing chess, cooking or forming sentences.<p>When you have a well developed style, you will quickly spot any deviations from it. At that point, it doesn't matter if your style was forced on you by the language or whether it's just a convention that you use.<p>It's certainly true that Haskellers expect a lot from the type system, even compared to other static languages, let alone Python.</p>
]]></description><pubDate>Tue, 09 Oct 2018 14:49:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=18176394</link><dc:creator>DanWaterworth</dc:creator><comments>https://news.ycombinator.com/item?id=18176394</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=18176394</guid></item><item><title><![CDATA[New comment by DanWaterworth in "Rust RAII is better than the Haskell bracket pattern"]]></title><description><![CDATA[
<p>If you are consuming an API that provides an object with a destructor, you are correct, you can determine when destructors will be called.<p>The issue is when you produce an API that contains objects with destructors. Since you are handing these entities off to unknown code, you cannot ensure that they will be dropped. This was a problem in scoped threads in Rust.</p>
]]></description><pubDate>Tue, 09 Oct 2018 08:35:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=18174218</link><dc:creator>DanWaterworth</dc:creator><comments>https://news.ycombinator.com/item?id=18174218</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=18174218</guid></item><item><title><![CDATA[New comment by DanWaterworth in "Rust RAII is better than the Haskell bracket pattern"]]></title><description><![CDATA[
<p>Python's "with" construct is analogous to the bracket pattern in Haskell that the article is talking about. It also works in the nested case in the presence of exceptions. Furthermore, the issue that Michael has with the bracket pattern in Haskell can also happen in Python.</p>
]]></description><pubDate>Tue, 09 Oct 2018 08:24:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=18174175</link><dc:creator>DanWaterworth</dc:creator><comments>https://news.ycombinator.com/item?id=18174175</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=18174175</guid></item><item><title><![CDATA[New comment by DanWaterworth in "Rust RAII is better than the Haskell bracket pattern"]]></title><description><![CDATA[
<p>> The thing is that, in Haskell, even when you attach a function to run during destruction, the runtime doesn't guarantee that the function will be called promptly, or even at all.<p>However, this is different than the bracket pattern that the article is taking about. No one in the Haskell community advocates cleaning up resources (like file descriptors, etc) using only destructors.</p>
]]></description><pubDate>Tue, 09 Oct 2018 08:17:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=18174154</link><dc:creator>DanWaterworth</dc:creator><comments>https://news.ycombinator.com/item?id=18174154</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=18174154</guid></item><item><title><![CDATA[New comment by DanWaterworth in "Rust RAII is better than the Haskell bracket pattern"]]></title><description><![CDATA[
<p>Sad to see you being downvoted when you are correct, see [1]<p>> forget is not marked as unsafe, because Rust's safety guarantees do not include a guarantee that destructors will always run.<p>This was a problem in Rust when scoped threads relied on destructors being run.<p>[1] <a href="https://doc.rust-lang.org/std/mem/fn.forget.html" rel="nofollow">https://doc.rust-lang.org/std/mem/fn.forget.html</a></p>
]]></description><pubDate>Tue, 09 Oct 2018 08:12:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=18174132</link><dc:creator>DanWaterworth</dc:creator><comments>https://news.ycombinator.com/item?id=18174132</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=18174132</guid></item><item><title><![CDATA[New comment by DanWaterworth in "Ask HN: What open source project, in your opinion, has the highest code quality?"]]></title><description><![CDATA[
<p>SQLite</p>
]]></description><pubDate>Fri, 21 Sep 2018 06:48:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=18037644</link><dc:creator>DanWaterworth</dc:creator><comments>https://news.ycombinator.com/item?id=18037644</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=18037644</guid></item><item><title><![CDATA[New comment by DanWaterworth in "There Is No Such Thing as Unconscious Thought"]]></title><description><![CDATA[
<p>You're right to complain that conquistadog's comment was irrelevant to your main point. It's frustrating when people miss what you are saying and get so hooked on trivialities. Incidentally, your nitpicking about my use of the word duress is also irrelevant.<p>Next, you call people childish, when you are acting immaturely. How does name-calling generally work out for you as a means for settling disagreements?<p>It also bugs me that you are not even technically correct. You see, I looked up the definition of duress before I posted. I am British, so I used the OED and it told me that in the legal sense of the word, duress is, "Constraint illegally exercised to force someone to perform an act." Based on that definition, I don't think I could have picked a word that would better suit my intention.</p>
]]></description><pubDate>Sun, 29 Jul 2018 06:37:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=17636842</link><dc:creator>DanWaterworth</dc:creator><comments>https://news.ycombinator.com/item?id=17636842</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=17636842</guid></item><item><title><![CDATA[New comment by DanWaterworth in "There Is No Such Thing as Unconscious Thought"]]></title><description><![CDATA[
<p>Off topic, and IANAL, but I believe this website breaks European law by refusing to serve the article to european residents who block cookies.<p>Under the ePrivacy legislation (and GDPR's redefinition of consent), you must obtain "freely given consent" to use cookies that are not necessary for the proper functioning of the site (and under this definition, analytics cookies are not necessary).<p>By refusing to serve the site to those who opt to block cookies, they ensure that consent can only be given under duress.</p>
]]></description><pubDate>Fri, 27 Jul 2018 20:20:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=17629004</link><dc:creator>DanWaterworth</dc:creator><comments>https://news.ycombinator.com/item?id=17629004</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=17629004</guid></item><item><title><![CDATA[New comment by DanWaterworth in "The Mythos of Model Interpretability in Machine Learning"]]></title><description><![CDATA[
<p>You may prefer this link: <a href="https://arxiv.org/abs/1606.03490" rel="nofollow">https://arxiv.org/abs/1606.03490</a></p>
]]></description><pubDate>Thu, 19 Jul 2018 07:43:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=17564510</link><dc:creator>DanWaterworth</dc:creator><comments>https://news.ycombinator.com/item?id=17564510</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=17564510</guid></item><item><title><![CDATA[New comment by DanWaterworth in "Nebulet: A microkernel that runs WebAssembly in Ring 0"]]></title><description><![CDATA[
<p>I agree with you for the most part here. For the things that I typically use computers for, I would prefer to have both hardware and software protected sandboxes. There's a reason that browsers are switching to using multiple processes.<p>I suspect you are being downvoted for being overly emphatic. I can certainly think of scenarios where having this extra security is more costly than helpful.<p>An interesting point of note is that the mill architecture has been designed to have much cheaper hardware protection than other architectures. [1]<p>[1] <a href="https://www.youtube.com/watch?v=5osiYZV8n3U" rel="nofollow">https://www.youtube.com/watch?v=5osiYZV8n3U</a></p>
]]></description><pubDate>Wed, 30 May 2018 15:36:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=17188536</link><dc:creator>DanWaterworth</dc:creator><comments>https://news.ycombinator.com/item?id=17188536</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=17188536</guid></item><item><title><![CDATA[New comment by DanWaterworth in "Is it worth supporting Firefox?"]]></title><description><![CDATA[
<p>The rule of thumb for restaurants is the poorer the website, the better the food. Restaurants with Flash-only pages that haven't been updated for 15 years are the best. Also, the cleaner the bathrooms, the cleaner the kitchen.</p>
]]></description><pubDate>Mon, 07 May 2018 13:20:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=17012472</link><dc:creator>DanWaterworth</dc:creator><comments>https://news.ycombinator.com/item?id=17012472</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=17012472</guid></item><item><title><![CDATA[New comment by DanWaterworth in "Boltzmann Encoded Adversarial Machines"]]></title><description><![CDATA[
<p>There's a good reason that the pictures look similar. Both architectures produce somewhat blurry images.<p>The problem, in BEGAN's case, is that when your idea of similarity is based of mean squared error, high frequency details are just not important. [1] You can see this by doing PCA on natural image patches. BEGAN uses an autoencoder trained on MSE.<p>RBMs produce blurry images because the architecture is not good at representing multiplicative interactions. You just get splodges of colour.<p>[1] <a href="http://danielwaterworth.com/posts/what's-wrong-with-autoencoders.html" rel="nofollow">http://danielwaterworth.com/posts/what's-wrong-with-autoenco...</a></p>
]]></description><pubDate>Fri, 27 Apr 2018 09:35:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=16939508</link><dc:creator>DanWaterworth</dc:creator><comments>https://news.ycombinator.com/item?id=16939508</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=16939508</guid></item><item><title><![CDATA[New comment by DanWaterworth in "Python, Go or Haskell?"]]></title><description><![CDATA[
<p>I have experience using each of these languages professionally, working in a team. Each of them have their own foibles that you'll be constantly railing against:<p><i>Python:</i><p>Large Python projects require discipline. To make it work, you'll need to adopt a rigid style, like DI, and use it religiously. It can be done; people do it, but if you think using Python will lower the barrier to entry to getting on the team, think again. Large projects in any language require talented people.<p><i>Go:</i><p>I don't like Go, so I have the least experience in it out of the three. There are positives, like fast compile times, but lacking generics and exceptions just makes Go annoying to me.<p><i>Haskell:</i><p>I have written a quite incredible amount of Haskell and before using it in a team, I was a huge proponent. Haskell is a well-designed language, but suffers a few major drawbacks. Large Haskell programs can take an age to compile; this is a productively killer. Universally agreed upon good styles for writing large Haskell programs don't exist. Library support is lacking. Space leaks will bite you. I would strongly advise against starting a large Haskell project.<p>To wrap up, in terms of your criteria, the language you use isn't going to change things very much.<p>* Each language has a good community for long term support,<p>* Complex code in any language is buggy; simple code in any language is less buggy,<p>* Good developers are hard to hire,<p>If performance is important, Python and Haskell perform similarly for code that people actually write. Go does better.</p>
]]></description><pubDate>Mon, 12 Mar 2018 13:02:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=16567855</link><dc:creator>DanWaterworth</dc:creator><comments>https://news.ycombinator.com/item?id=16567855</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=16567855</guid></item><item><title><![CDATA[New comment by DanWaterworth in "What We Found When X-Raying Some MLB Baseballs"]]></title><description><![CDATA[
<p>Disinterested means impartial, you are uninterested.</p>
]]></description><pubDate>Sat, 03 Mar 2018 14:30:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=16509381</link><dc:creator>DanWaterworth</dc:creator><comments>https://news.ycombinator.com/item?id=16509381</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=16509381</guid></item><item><title><![CDATA[The Risk Economy]]></title><description><![CDATA[
<p>Article URL: <a href="http://danielwaterworth.com/bloglets/2018_01_25.html">http://danielwaterworth.com/bloglets/2018_01_25.html</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=16230199">https://news.ycombinator.com/item?id=16230199</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Thu, 25 Jan 2018 11:34:53 +0000</pubDate><link>http://danielwaterworth.com/bloglets/2018_01_25.html</link><dc:creator>DanWaterworth</dc:creator><comments>https://news.ycombinator.com/item?id=16230199</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=16230199</guid></item><item><title><![CDATA[New comment by DanWaterworth in "Turning Soybeans into Diesel Fuel Is Costing Billions"]]></title><description><![CDATA[
<p>Also in the medium term, artificially increasing the price of fuel incentivizes research and development of alternatives.</p>
]]></description><pubDate>Wed, 17 Jan 2018 18:28:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=16170393</link><dc:creator>DanWaterworth</dc:creator><comments>https://news.ycombinator.com/item?id=16170393</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=16170393</guid></item><item><title><![CDATA[New comment by DanWaterworth in "TensorFlow Examples for Beginners with Latest APIs"]]></title><description><![CDATA[
<p>If you don't mind me asking, why do you want to do this?</p>
]]></description><pubDate>Tue, 26 Sep 2017 14:45:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=15339094</link><dc:creator>DanWaterworth</dc:creator><comments>https://news.ycombinator.com/item?id=15339094</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=15339094</guid></item></channel></rss>