<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: _rend</title><link>https://news.ycombinator.com/user?id=_rend</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Mon, 05 Oct 2026 00:18:00 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=_rend" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by _rend in "Bill Draper has died"]]></title><description><![CDATA[
<p>Too on-the-nose to make for good fiction.</p>
]]></description><pubDate>Sun, 04 Oct 2026 19:55:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=49957242</link><dc:creator>_rend</dc:creator><comments>https://news.ycombinator.com/item?id=49957242</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49957242</guid></item><item><title><![CDATA[New comment by _rend in "Ask HN: Does anyone know what a monad is?"]]></title><description><![CDATA[
<p>To expand a bit, too, on how these definitions make side effects easier to represent in Haskell:<p>One way to represent side effects in a purely functional language is to model them as if they <i>aren't</i> side effects, by representing them as state changes in the "outside world". You don't need to grok the specifics of this, but the definition of the `IO` monad is:<p><pre><code>  newtype IO a = IO (State# RealWorld -> (# State# RealWorld, a #))
</code></pre>
i.e., it's a "pure" transformation of the "real world".<p>This allows you to define a "box" called `IO` that represents a computation that can perform a side-effect (by affecting the "real world"), then returning a value.<p>The real trick to this is that the "box" is entirely opaque to you: unlike a list or a `Maybe` where you know how to reach in and pull values _out_ (e.g., `head`, `last`, `fromJust`, etc.), `IO` doesn't allow you to do this*. Once you have something inside of an `IO` box, it's stuck there.<p>This means that you can separate the "impure" world from the "pure" world: you can't perform side effects arbitrarily — you're can only do so in an `IO` context that's intentionally "viral".<p>The functor/applicative/monad rules just make `IO` easier to use and consume:<p><pre><code>  1. `Functor` allows you to "map" over the results of a computation
  2. `Applicative` allows you to chain computations together in order so side effects happen in sequence
  3. `Monad` makes it easier to repeatedly chain computations within a single `IO` context (so if you need to perform repeated side effects, you can "stay" in the outer context — `IO a` instead of `IO (IO (IO (IO (... (IO a)))))`)
</code></pre>
This is just <i>one</i> way to represent side effects, and the monad rules are only really needed to make this representation ergonomic to actually use.<p>(*There is technically a way to "escape" the `IO` monad called `unsafePerformIO`, but you basically <i>never</i> need to use this. If you find yourself reaching for it, don't.)</p>
]]></description><pubDate>Wed, 13 May 2026 15:32:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=48123271</link><dc:creator>_rend</dc:creator><comments>https://news.ycombinator.com/item?id=48123271</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48123271</guid></item><item><title><![CDATA[New comment by _rend in "Ask HN: Does anyone know what a monad is?"]]></title><description><![CDATA[
<p>Sure! "Box" here is used to just abstractly describe a value that contains other values. Let's take a list as an example:<p><pre><code>  [1, 2, 3] :: [Int]
</code></pre>
Here, the "box" is a list, and inside of it are the values 1, 2, and 3.<p>As you know, `map` is an operation that converts the values inside of the box into other values; for example, adding 1 to every element:<p><pre><code>  [1, 2, 3] :: [Int]
   |  |  |     (+ 1)
   v  v  v
  [2, 3, 4] :: [Int]
</code></pre>
But the operation you perform with `map` doesn't need to keep the values of the same type:<p><pre><code>  [ 1,   2,   3 ] :: [Int]
    |    |    |      (show)
    v    v    v
  ["1", "2", "3"] :: [String]
</code></pre>
The operation can also produce new boxes! Since `String` is actually itself a list (`[Char]`), the result above is the same as<p><pre><code>  [  1,     2,     3  ] :: [Int]
     |      |      |       (show)
     v      v      v
  [['1'], ['2'], ['3']] :: [[Char]]
</code></pre>
In some cases, you might want to "flatten" this box-of-boxes together. In some languages this operation is called "flatten"; for lists in Haskell, it's called `concat`<p><pre><code>  [['1'], ['2'], ['3']] :: [[Char]]
     |      |      |       (concat)
     v      v      v
  [ '1',   '2',   '3' ] :: [Char]
</code></pre>
This example isn't terribly motivating, but you can see when you have deeper lists-of-lists how this might be handy:<p><pre><code>  [[1,2,3], [4,5,6], [7,8,9]] :: [[Int]]
      |        |        |        (concat)
      v        v        v
  [1, 2, 3, 4, 5, 6, 7, 8, 9] :: [Int]
</code></pre>
Here, we took a collection of boxes (`[[Int]]`) and combined them in order (sequentially) to produce a new box (`[Int]`).<p>What other languages call `flatMap` is just a `map` operation followed by a `flatten` operation. Very roughly, `Functor` gives you "map" (`map`), `Applicative` gives you "flatten" (`concat`), and `Monad` gives you "flatMap" (`concatMap`).<p>The power of these comes from considering different types of "boxes". `Maybe`, for example, works almost like a list that can contain up to 1 element, and its operations behave pretty much identically. Other types are interesting because how you define their "box-ness" can lead to interesting/useful results. It can be tough to envision how, e.g., a function could look like a "box", but it turns out that you can define rules for it that make it useful. (What does "map" look like for a function? Well, it turns out that mapping a function over another function is already just... function composition!)<p>You can go a lot deeper into these definitions, and it helps to look at some implementations to grok them better, but the core concepts <i>themselves</i> are not very complicated. The "magic" is in how you define the "boxes".</p>
]]></description><pubDate>Wed, 13 May 2026 13:35:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=48121729</link><dc:creator>_rend</dc:creator><comments>https://news.ycombinator.com/item?id=48121729</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48121729</guid></item><item><title><![CDATA[New comment by _rend in "Ask HN: Does anyone know what a monad is?"]]></title><description><![CDATA[
<p>My personal alternative take to the usual monad tutorial — greatly simplified:<p>"Functor", "Applicative", and "Monad" are all just generalizations of the concept of `map` and `flatMap`.<p><pre><code>  1. Something is a "Functor" if you know how to call `map` on it, nothing more. "I can take a box of things and turn it into a box of other things, 1-to-1". On lists, for example, this is just `map` itself
  2. Something is an "Applicative" if you know how to call `map` on it, but also know how to take a non-boxed value and put it in a box, and also know how to combine boxes in order
  3. Something is a "Monad" if you know how to do all of the above, but also know how to call `flatMap` on it, nothing more. "I can take a box of things, turn each thing into a new box, and then combine them all in order". On lists, for example this is just `concatMap`
</code></pre>
There's nothing really more complex to it, besides how you squint at various things (like functions) to fit them into the concept of `map` and `flatMap`.<p>To answer your questions more directly:<p><pre><code>  1. Monads themselves are neither necessary nor sufficient to perform side effects in Haskell; they don't directly enable the effects, but they *do* help place guardrails on the actual unsafe, low-level code which *can* perform the effects, safely and in an ergonomic and composable way
  2. Yes, "Monad" is just a name for a recurring way to approach a problem. Like in most math and programming, a certain repeating pattern was noticed, and given a name. Because of the math origin of the term, you get "Monad" instead of "flat-mappable"
  3. Like any other tool, you reach for a monad when you have a monad-shaped problem. They're just one (powerful) tool for solving certain problems</code></pre></p>
]]></description><pubDate>Wed, 13 May 2026 00:03:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=48116200</link><dc:creator>_rend</dc:creator><comments>https://news.ycombinator.com/item?id=48116200</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48116200</guid></item><item><title><![CDATA[New comment by _rend in "What do you say when the AI asks "Let me know if you'd like me to proceed.""]]></title><description><![CDATA[
<p>"Go ahead"?</p>
]]></description><pubDate>Thu, 07 May 2026 00:57:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=48044101</link><dc:creator>_rend</dc:creator><comments>https://news.ycombinator.com/item?id=48044101</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48044101</guid></item><item><title><![CDATA[New comment by _rend in "Tuna: A new, modern, modal launcher for macOS"]]></title><description><![CDATA[
<p>This is awesome! Love to see something new in this space, especially so heavily inspired by QuickSilver. The UI is slick and fast, and the fuzzy matching (and the match UI itself) is excellent.<p>If you're taking feedback, I've been a >decade-long user of LaunchBar, and I've yet to find another launcher that handles my most common actions quite as well (except maybe Alfred):<p>1. I launch a ton of URLs directly from LaunchBar, and it's a killer feature for me to be able to start typing a URL (not intending to match anything) and as soon as I type a period, LaunchBar converts the search to a URL (and inserts 'https://' and '.com'). e.g., if I type "abc.", LaunchBar will expand to "<a href="https://abc.com" rel="nofollow">https://abc.com</a>" with the ".com" highlighted for replacement (and hitting Return will open the URL immediately). Right now, if I want to do the same with Tuna and my default mode is Fuzzy Mode, I <i>believe</i> I need to hit '"' to enter Text Mode, type the URL, hit Tab, then search for the "Open URL" action (which also won't recognize a "bare" URL without the scheme, so won't show up for, e.g., "abc.com") — but happy to be wrong! I think it'd be swell if it were possible to configure Tuna to, on '.', convert into text mode, automatically insert "https://" and ".com", and automatically pre-populate the "Open URL" action so I could just hit Return to confirm and launch<p>2. I use the inline calculator a lot, and really like the "auto math" switch when typing digits (<i>and</i> really like the carve-out for 1Password, where typing '1' will show 1Password in fuzzy search instead of switching to the calculator); switching to text mode automatically on numeric input would be really helpful to do the same<p>3. I have a few custom search templates in LaunchBar I use all the time (several different search engines), and I'm not sure if it's possible to set up something similar directly inside of Tuna yet without writing custom services or an extension<p>Obviously, this is just how I use LaunchBar, and may not fit in with your vision of Tuna, but figured it might be some helpful food for thought! Thanks for your work on this :)</p>
]]></description><pubDate>Wed, 25 Feb 2026 18:27:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=47155575</link><dc:creator>_rend</dc:creator><comments>https://news.ycombinator.com/item?id=47155575</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47155575</guid></item><item><title><![CDATA[New comment by _rend in "GridCalc: An RPN Spreadsheet for iOS"]]></title><description><![CDATA[
<p>This is awesome! The design is slick, and it really does feel right at home on a portable device. Appreciate the work that went into this.<p>Even more so, huge kudos for the performance tuning! The app launches <i>instantly</i>, so much so that I was initially a bit shocked. I'd forgotten what it feels like to tap a button and have something functional appear on screen with <i>zero</i> delay. When even the simplest apps have loading screens (and even built-in Settings/Reminders/Notes/Phone/etc. have a delay), this was really refreshing to see! I legitimately force-quit a bunch of apps on my phone to compare and nothing comes close on cold launch. Great work!</p>
]]></description><pubDate>Wed, 25 Feb 2026 17:10:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=47154336</link><dc:creator>_rend</dc:creator><comments>https://news.ycombinator.com/item?id=47154336</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47154336</guid></item><item><title><![CDATA[Trump says he'll raise tariffs to 15 percent after Supreme Court ruling]]></title><description><![CDATA[
<p>Article URL: <a href="https://apnews.com/article/trump-tariff-truth-social-872c8f04112a8991d8aa6ae5005767b6">https://apnews.com/article/trump-tariff-truth-social-872c8f04112a8991d8aa6ae5005767b6</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47104479">https://news.ycombinator.com/item?id=47104479</a></p>
<p>Points: 17</p>
<p># Comments: 9</p>
]]></description><pubDate>Sat, 21 Feb 2026 20:38:45 +0000</pubDate><link>https://apnews.com/article/trump-tariff-truth-social-872c8f04112a8991d8aa6ae5005767b6</link><dc:creator>_rend</dc:creator><comments>https://news.ycombinator.com/item?id=47104479</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47104479</guid></item><item><title><![CDATA[New comment by _rend in "Odin: Moving Towards a New "core:OS""]]></title><description><![CDATA[
<p>This is Swift, where Type? is syntax sugar for Optional<Type>. Swift's Optional is a standard sum type, with a lot of syntax sugar and compiler niceties to make common cases easier and nicer to work with.</p>
]]></description><pubDate>Wed, 31 Dec 2025 13:57:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=46444066</link><dc:creator>_rend</dc:creator><comments>https://news.ycombinator.com/item?id=46444066</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46444066</guid></item><item><title><![CDATA[New comment by _rend in "The Best Line Length"]]></title><description><![CDATA[
<p>I personally much prefer screen width / 1.618, but to each their own</p>
]]></description><pubDate>Tue, 12 Aug 2025 12:08:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=44875211</link><dc:creator>_rend</dc:creator><comments>https://news.ycombinator.com/item?id=44875211</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44875211</guid></item><item><title><![CDATA[New comment by _rend in "Writing memory efficient C structs"]]></title><description><![CDATA[
<p>For completeness, this description of alignment is misleading:<p>> Well, dear reader, this padding is added because the CPU needs memory to be aligned in sets of 4 bytes because it’s optimized in that fashion.<p>> ...<p>> Remember: since structs are aligned to 4 bytes, any padding is therefore unnecessary if the size of the struct is a multiple of 4 without the padding.<p>Individual data types have their own alignment (e.g., `bool`/`char` may be 1, `short` may be 2, `int` may be 4, `long` may be 8, etc.), and the alignment of a compound type (like a struct) defaults to the maximum alignment of its constituent types.<p>In this article, `struct Monster` has an alignment of 4 because `int` and `float` have an alignment of 4 for the author's configuration. Expanding one of the `int`s to a `long` could increase the alignment to 8 on some CPUs, and removing the `int` and `float` fields would decrease the alignment to 1 for most CPUs.</p>
]]></description><pubDate>Wed, 30 Jul 2025 15:21:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=44735427</link><dc:creator>_rend</dc:creator><comments>https://news.ycombinator.com/item?id=44735427</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44735427</guid></item><item><title><![CDATA[New comment by _rend in "Hyperspace"]]></title><description><![CDATA[
<p>> Which means if you actually edited those files, you might fill up your HD much more quickly than you expected.<p>I'm not sure if this is what you intended, but just to be sure: writing changes to a cloned file doesn't immediately duplicate the entire file again in order to write those changes — they're actually written out-of-line, and the identical blocks are only stored once. From [the docs](^1) posted in a sibling comment:<p>> Modifications to the data are written elsewhere, and both files continue to share the unmodified blocks. You can use this behavior, for example, to reduce storage space required for document revisions and copies. The figure below shows a file named “My file” and its copy “My file copy” that have two blocks in common and one block that varies between them. On file systems like HFS Plus, they’d each need three on-disk blocks, but on an Apple File System volume, the two common blocks are shared.<p>[^1]: <a href="https://developer.apple.com/documentation/foundation/file_system/about_apple_file_system" rel="nofollow">https://developer.apple.com/documentation/foundation/file_sy...</a></p>
]]></description><pubDate>Tue, 25 Feb 2025 19:42:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=43176357</link><dc:creator>_rend</dc:creator><comments>https://news.ycombinator.com/item?id=43176357</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43176357</guid></item><item><title><![CDATA[New comment by _rend in "Apple Smells Blood in the Water"]]></title><description><![CDATA[
<p>> Award-winning photo editing, graphic design and page layout software for Mac, Windows & iPad.<p>They've supported Windows and iPad for years, too.</p>
]]></description><pubDate>Sat, 16 Nov 2024 19:14:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=42158480</link><dc:creator>_rend</dc:creator><comments>https://news.ycombinator.com/item?id=42158480</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42158480</guid></item><item><title><![CDATA[New comment by _rend in "Judge dismisses majority of GitHub Copilot copyright claims"]]></title><description><![CDATA[
<p>Not at all: unless a license is provided, the code is fully protected under copyright and you have _no_ rights to copy it or use it in _any_ way you want (unless falling under "fair use" clauses for the jurisdiction you're in/the author is in).</p>
]]></description><pubDate>Wed, 28 Aug 2024 18:43:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=41382783</link><dc:creator>_rend</dc:creator><comments>https://news.ycombinator.com/item?id=41382783</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41382783</guid></item><item><title><![CDATA[Supreme Court rules ex-presidents have immunity for official acts]]></title><description><![CDATA[
<p>Article URL: <a href="https://apnews.com/article/supreme-court-trump-capitol-riot-immunity-2dc0d1c2368d404adc0054151490f542">https://apnews.com/article/supreme-court-trump-capitol-riot-immunity-2dc0d1c2368d404adc0054151490f542</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=40847963">https://news.ycombinator.com/item?id=40847963</a></p>
<p>Points: 877</p>
<p># Comments: 1889</p>
]]></description><pubDate>Mon, 01 Jul 2024 17:19:52 +0000</pubDate><link>https://apnews.com/article/supreme-court-trump-capitol-riot-immunity-2dc0d1c2368d404adc0054151490f542</link><dc:creator>_rend</dc:creator><comments>https://news.ycombinator.com/item?id=40847963</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40847963</guid></item><item><title><![CDATA[New comment by _rend in "Zellij: A terminal workspace with batteries included"]]></title><description><![CDATA[
<p>You're right, good question. At least partially, habit and muscle memory. I'm used to the keybindings, and the behavior for navigating tabs/splits/panes (across macOS, Windows, and Linux).<p>But also, native splits/panes and tabs cover 90% of what I really want from a multiplexer, so it's easier for me personally to stick with familiar behavior than to integrate another tool into my workflow just to recreate it.</p>
]]></description><pubDate>Sun, 26 May 2024 02:20:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=40479344</link><dc:creator>_rend</dc:creator><comments>https://news.ycombinator.com/item?id=40479344</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40479344</guid></item><item><title><![CDATA[New comment by _rend in "Zellij: A terminal workspace with batteries included"]]></title><description><![CDATA[
<p>Zellij is pretty great, and I recommend others check it out. The UI is extremely slick, and getting a comfortable setup is nicer (to me) than tmux or screen.<p>Unfortunately, it's missing one key feature that keeps me from using it as a daily-driver: it doesn't appear to be possible to attach to an existing session by automatically creating a new tab or pane. iTerm2 has fantastic integration with tmux that allows it to directly create a new tmux tab for every native iTerm2 split or tab, and I was hoping to recreate that with Zellij, outside of iTerm2.<p>It _is_ possible to open a new tab with the `new-tab` action (or whatever it's called), but unfortunately, there's no way to do that "in the background": one of your open sessions always switches to that new tab when it opens. I don't know if this is a limitation of the session/tab system, but when I dug through the source, I couldn't for the life of me figure out why this was happening.<p>I did spend some time trying to contribute a flag to allow attaching to existing sessions with a new tab/pane, but the actual architecture in place back then made this very difficult to support without non-trivial refactoring (and at least at the time, Zellij wasn't accepting any major contributions that weren't directly aligned with the roadmap, which I respect: there's only enough time in the day to review random PRs).<p>I check back periodically; if this is made possible at some point, I'd love to switch to it.</p>
]]></description><pubDate>Sun, 26 May 2024 00:45:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=40478925</link><dc:creator>_rend</dc:creator><comments>https://news.ycombinator.com/item?id=40478925</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40478925</guid></item><item><title><![CDATA[New comment by _rend in "Swift for C++ Practitioners, Part 1: Intro and Value Types"]]></title><description><![CDATA[
<p>I think it'd be curious to see the code, some example strings, and whether or not you compiled with optimizations enabled — if you're willing to share. There's no reason for this to have been the case.</p>
]]></description><pubDate>Mon, 15 Apr 2024 16:19:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=40042536</link><dc:creator>_rend</dc:creator><comments>https://news.ycombinator.com/item?id=40042536</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40042536</guid></item><item><title><![CDATA[New comment by _rend in "MTA board votes to approve new $15 toll to drive into Manhattan"]]></title><description><![CDATA[
<p>> Financially, a doctor won't notice it.<p>Not all doctors make enough money to not notice it, especially ones earlier in their career.<p>Regardless, assuming you have two working adults each paying the $15 toll once a day, conservatively, working 250 days a year, that's $7,500/year that has to come from somewhere. I can't imagine an income level (even if it doesn't affect your quality of life) where that's not an insanely frustrating amount to pay… to the MTA of all places. That money getting reinvested into useful infrastructure would be a dream come true!</p>
]]></description><pubDate>Wed, 27 Mar 2024 21:34:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=39844866</link><dc:creator>_rend</dc:creator><comments>https://news.ycombinator.com/item?id=39844866</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39844866</guid></item><item><title><![CDATA[New comment by _rend in "MTA board votes to approve new $15 toll to drive into Manhattan"]]></title><description><![CDATA[
<p>As a former NYC resident, and as someone whose family still lives and works in the city, I'm curious to see how this'll distribute traffic patterns throughout Manhattan. If you live in the outer boroughs like my family does, getting into certain areas in Manhattan via public transit can be difficult, and time consuming — significantly more so than getting in by car.<p>My dad is an on-call doctor; getting to his hospital by car takes ~15 minutes, but ~60–90 via public transit. His patients don't have the luxury of waiting for him to take the bus. His hospital is outside of this zone, but I imagine that paying $15 every time he got called in would be extraordinarily frustrating.<p>My mom does work within this zone, also in places not easily reachable by public transit. I suspect that she, like many others, will still commute into Manhattan, park in areas outside of the zone, then take public transit into it — which will increase congestion in those areas. It'll be interesting to watch for the lead-on effects.<p>I sympathize entirely with the desire to reduce traffic in the city, but man, for people who live far from work and can't easily commute any other way, what a pain.</p>
]]></description><pubDate>Wed, 27 Mar 2024 20:24:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=39844146</link><dc:creator>_rend</dc:creator><comments>https://news.ycombinator.com/item?id=39844146</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39844146</guid></item></channel></rss>