<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: brandonspark</title><link>https://news.ycombinator.com/user?id=brandonspark</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Fri, 15 May 2026 10:11:24 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=brandonspark" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by brandonspark in "Less is safer: Reducing the risk of supply chain attacks"]]></title><description><![CDATA[
<p>but still along the same lines as "safer". the stresses are different, "safer" has the stress as "SAY-fer" and "secure" has the stress as "sih-KYOOR". the latter sounds more similar (and rhymes better) with "more", the originator of the phrase "less is more"</p>
]]></description><pubDate>Fri, 19 Sep 2025 23:34:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=45308078</link><dc:creator>brandonspark</dc:creator><comments>https://news.ycombinator.com/item?id=45308078</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45308078</guid></item><item><title><![CDATA[New comment by brandonspark in "Less is safer: Reducing the risk of supply chain attacks"]]></title><description><![CDATA[
<p>missed opportunity for "less is secure"</p>
]]></description><pubDate>Fri, 19 Sep 2025 23:15:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=45307927</link><dc:creator>brandonspark</dc:creator><comments>https://news.ycombinator.com/item?id=45307927</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45307927</guid></item><item><title><![CDATA[Reviewer First Pull Requests]]></title><description><![CDATA[
<p>Article URL: <a href="https://www.5xx.engineer/2025/02/13/rfprs.html">https://www.5xx.engineer/2025/02/13/rfprs.html</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=44007479">https://news.ycombinator.com/item?id=44007479</a></p>
<p>Points: 2</p>
<p># Comments: 0</p>
]]></description><pubDate>Fri, 16 May 2025 16:45:22 +0000</pubDate><link>https://www.5xx.engineer/2025/02/13/rfprs.html</link><dc:creator>brandonspark</dc:creator><comments>https://news.ycombinator.com/item?id=44007479</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44007479</guid></item><item><title><![CDATA[New comment by brandonspark in "Functional Programming Lessons Conclusion"]]></title><description><![CDATA[
<p>I see. This is indeed the in-depth breakdown I was looking for, thank you.</p>
]]></description><pubDate>Mon, 14 Apr 2025 21:49:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=43686696</link><dc:creator>brandonspark</dc:creator><comments>https://news.ycombinator.com/item?id=43686696</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43686696</guid></item><item><title><![CDATA[New comment by brandonspark in "Functional Programming Lessons Conclusion"]]></title><description><![CDATA[
<p>I was hoping this article would be a little more concrete, but it seems that it largely is talking about the takeaways about functional programming in a philosophical, effort-in vs value-out kind of way. This is valuable, but for people unfamiliar with functional programming I'm not sure that it gives much context for understanding.<p>I agree with the high-level, though. I find that people (with respect to programming languages) focus far too much on the specific, nitpicky details (whether I use the `let` keyword, whether I have explicit type annotations or type inference). I find the global, project-level benefits to be far more tangible.</p>
]]></description><pubDate>Mon, 14 Apr 2025 17:49:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=43684088</link><dc:creator>brandonspark</dc:creator><comments>https://news.ycombinator.com/item?id=43684088</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43684088</guid></item><item><title><![CDATA[New comment by brandonspark in "My journey to teaching computer science, functionally"]]></title><description><![CDATA[
<p>Context: I posted my functional programming lectures to HackerNews some time ago (this thread: <a href="https://news.ycombinator.com/item?id=38351195">https://news.ycombinator.com/item?id=38351195</a>) and finally got around to writing a blog post about my experience teaching functional programming. You can read about my experiences here.</p>
]]></description><pubDate>Wed, 19 Feb 2025 18:11:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=43105302</link><dc:creator>brandonspark</dc:creator><comments>https://news.ycombinator.com/item?id=43105302</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43105302</guid></item><item><title><![CDATA[My journey to teaching computer science, functionally]]></title><description><![CDATA[
<p>Article URL: <a href="https://brandonspark.github.io/blog/teaching/">https://brandonspark.github.io/blog/teaching/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=43105301">https://news.ycombinator.com/item?id=43105301</a></p>
<p>Points: 8</p>
<p># Comments: 1</p>
]]></description><pubDate>Wed, 19 Feb 2025 18:11:27 +0000</pubDate><link>https://brandonspark.github.io/blog/teaching/</link><dc:creator>brandonspark</dc:creator><comments>https://news.ycombinator.com/item?id=43105301</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43105301</guid></item><item><title><![CDATA[New comment by brandonspark in "Opengrep – The Security Industry Deserves Better"]]></title><description><![CDATA[
<p>"Opengrep"? But `grep` is already free...</p>
]]></description><pubDate>Wed, 29 Jan 2025 20:04:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=42870402</link><dc:creator>brandonspark</dc:creator><comments>https://news.ycombinator.com/item?id=42870402</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42870402</guid></item><item><title><![CDATA[New comment by brandonspark in "Show HN: Semgrep Assistant, a set of surgical AI tools for AppSec"]]></title><description><![CDATA[
<p>thank you!</p>
]]></description><pubDate>Thu, 23 Jan 2025 20:14:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=42807606</link><dc:creator>brandonspark</dc:creator><comments>https://news.ycombinator.com/item?id=42807606</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42807606</guid></item><item><title><![CDATA[New comment by brandonspark in "Parse, Don't Validate (2019)"]]></title><description><![CDATA[
<p>There's no reason this couldn't be done. Indeed, in OCaml (which I am more familiar with), you could easily define:<p>```ocaml<p>type 'a nonempty = Single of 'a | Cons of 'a * 'a nonempty<p>```<p>This would be the type of lists that contain one or more elements of the type parameter.<p>I think it's just convention that typically, when we talk about lists, we are interested in the empty case as well. Finding "all X that satisfy P in Y", as a general computational problem, is _very_ common (consider: filtering a list, querying for a predicate in a collection, finding sequences of moves in a search space), and generally could result in an empty list as a possible output.<p>In a non-practical sense, if you want the type theory, another reason is you can think of `[a]` as the free monoid on the collection of `a`. In other words, strings of elements of `a`, joined via concatenation. This monoid requires a unit, which is the empty list.</p>
]]></description><pubDate>Mon, 22 Jul 2024 09:39:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=41032477</link><dc:creator>brandonspark</dc:creator><comments>https://news.ycombinator.com/item?id=41032477</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41032477</guid></item><item><title><![CDATA[New comment by brandonspark in "Comparing OCaml and Standard ML (2008)"]]></title><description><![CDATA[
<p>This one makes sense to me, since lists are way more canonically used than arrays in functional languages. I rarely find myself constructing array literals -- I'm far more likely to simply convert from a list.<p>Though, I agree the semicolon delimiting is regrettable.</p>
]]></description><pubDate>Mon, 17 Jun 2024 23:39:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=40712496</link><dc:creator>brandonspark</dc:creator><comments>https://news.ycombinator.com/item?id=40712496</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40712496</guid></item><item><title><![CDATA[Securing CodeQL queries using Semgrep]]></title><description><![CDATA[
<p>Article URL: <a href="https://semgrep.dev/blog/2024/securing-codeql-with-semgrep/">https://semgrep.dev/blog/2024/securing-codeql-with-semgrep/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=39897188">https://news.ycombinator.com/item?id=39897188</a></p>
<p>Points: 11</p>
<p># Comments: 2</p>
]]></description><pubDate>Mon, 01 Apr 2024 18:10:30 +0000</pubDate><link>https://semgrep.dev/blog/2024/securing-codeql-with-semgrep/</link><dc:creator>brandonspark</dc:creator><comments>https://news.ycombinator.com/item?id=39897188</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39897188</guid></item><item><title><![CDATA[From SML to OCaml]]></title><description><![CDATA[
<p>Article URL: <a href="https://brandonspark.github.io/ocaml/">https://brandonspark.github.io/ocaml/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=39276545">https://news.ycombinator.com/item?id=39276545</a></p>
<p>Points: 5</p>
<p># Comments: 0</p>
]]></description><pubDate>Tue, 06 Feb 2024 16:40:51 +0000</pubDate><link>https://brandonspark.github.io/ocaml/</link><dc:creator>brandonspark</dc:creator><comments>https://news.ycombinator.com/item?id=39276545</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39276545</guid></item><item><title><![CDATA[New comment by brandonspark in "15-150: Principles of Functional Programming"]]></title><description><![CDATA[
<p>Haha, maybe. I'm not looking to earn any money from this, though. Time is the bigger constraint in my life at the moment.</p>
]]></description><pubDate>Tue, 21 Nov 2023 03:08:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=38358536</link><dc:creator>brandonspark</dc:creator><comments>https://news.ycombinator.com/item?id=38358536</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38358536</guid></item><item><title><![CDATA[New comment by brandonspark in "15-150: Principles of Functional Programming"]]></title><description><![CDATA[
<p>If you get to around lecture 9, a classic example I always tell people to start with is a calculator!<p>For instance, here's the SML code for it:<p>```
datatype exp =<p><pre><code>    Num of int

  | Plus of exp * exp

  | Minus of exp * exp

  | Times of exp * exp

  | Div of exp * exp

</code></pre>
```<p>Implement the function `eval : exp -> int`, which evaluates the expression as best as it can. Assume no division by zero.<p>Extra credit: Can you implement `eval' : exp -> int option`, that returns `SOME n` if the expression evaluates, and `NONE` if it divides by zero?</p>
]]></description><pubDate>Mon, 20 Nov 2023 20:23:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=38354106</link><dc:creator>brandonspark</dc:creator><comments>https://news.ycombinator.com/item?id=38354106</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38354106</guid></item><item><title><![CDATA[New comment by brandonspark in "15-150: Principles of Functional Programming"]]></title><description><![CDATA[
<p>This is Haskell-specific, it sounds like. I agree, the IO monad is really quite inconvenient sometimes.<p>I work in OCaml, which is also a functional language, but prints can be added in single lines. I address this point in Lecture 19 (Imperative Programming), actually, but my perspective is -- we invented immutability and purity to serve us, but we need not be fanatically beholden to it. In my opinion, I think Haskell goes in that direction, when every usage of IO now needs the IO monad to get involved.<p>A little mutability is OK. Functional programming is about the avoidance of side effects, more than simply forbidding it.</p>
]]></description><pubDate>Mon, 20 Nov 2023 19:43:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=38353407</link><dc:creator>brandonspark</dc:creator><comments>https://news.ycombinator.com/item?id=38353407</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38353407</guid></item><item><title><![CDATA[New comment by brandonspark in "15-150: Principles of Functional Programming"]]></title><description><![CDATA[
<p>(but I have thought of developing my own exercises independently to go with the lectures, to post on my website. This is generally a lot of work, though, so this might take some time, depending on how much people would benefit from it.)</p>
]]></description><pubDate>Mon, 20 Nov 2023 19:37:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=38353315</link><dc:creator>brandonspark</dc:creator><comments>https://news.ycombinator.com/item?id=38353315</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38353315</guid></item><item><title><![CDATA[New comment by brandonspark in "15-150: Principles of Functional Programming"]]></title><description><![CDATA[
<p>Unfortunately, it does not. These lectures are "mine", in the sense that I developed all of them myself, but the homeworks and lab exercises are the combined efforts of generations of TAs and instructors from the past. It wouldn't be right for me to give them away. (they are also reused from time to time, so there are academic integrity concerns with that also)</p>
]]></description><pubDate>Mon, 20 Nov 2023 19:34:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=38353272</link><dc:creator>brandonspark</dc:creator><comments>https://news.ycombinator.com/item?id=38353272</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38353272</guid></item><item><title><![CDATA[New comment by brandonspark in "15-150: Principles of Functional Programming"]]></title><description><![CDATA[
<p>There's a few things which go into this (hi, I'm the instructor!).<p>One such reason is historical. Standard ML is a research language, and a significant amount of work on it was done by professors at Carnegie Mellon, who developed the curriculum for this course.<p>Even setting that aside though, I fully agree with the choice to teach it in SML. For transparency, I work professionally in OCaml, so I am not unfamiliar with it, and I enjoy it quite a bit. That being said, I think that the approach taken by CMU is best summarized as the fact that languages are ephemeral, and the concepts are what matters. We don't teach programming languages, we teach concepts -- so even if SML is not widely used, the tradeoff for having students have a simpler, less distracting, and better learning experience is well worth it.<p>OCaml has its own intricacies that make things difficult. For instance, you can go down a lot of rabbit holes with `dune` and `utop` and `ocamlc` and `ocamlopt` and all of these things, versus SML/NJ's simple interactive REPL. Another thing is that the language is just generally more "bloated" -- you can teach modules, but then what if a student starts running into first-class modules, recursive modules, or even beyond that, GADTs and classes and objects?<p>(as an aside, this is my primary reason for why I would not want to teach an introductory course in Haskell. To do anything, you suddenly need to understand the concept of type classes and lazy evaluation, and that's simply too much. I don't know much about the other languages.)<p>I think teaching is as much enabling students to succeed as it is to prevent them from shooting themselves in the foot. For an anecdote, there is an `Option.valOf` function (of type `'a option -> 'a`), which essentially is just a bad function that should be avoided where possible. Every semester, without fail, even though we never tell students that function exists, students are smart enough to use Google, and will use it anyways, ultimately harming themselves.<p>I think that same mentality applies to programming language choice, here. Keep it simple, keep it neat, and make sure that the students see what is necessary for their education, and not have to spend mental energy thinking about much more.</p>
]]></description><pubDate>Mon, 20 Nov 2023 19:29:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=38353188</link><dc:creator>brandonspark</dc:creator><comments>https://news.ycombinator.com/item?id=38353188</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38353188</guid></item><item><title><![CDATA[15-150: Principles of Functional Programming]]></title><description><![CDATA[
<p>Article URL: <a href="https://brandonspark.github.io/150/">https://brandonspark.github.io/150/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=38351195">https://news.ycombinator.com/item?id=38351195</a></p>
<p>Points: 448</p>
<p># Comments: 126</p>
]]></description><pubDate>Mon, 20 Nov 2023 17:34:50 +0000</pubDate><link>https://brandonspark.github.io/150/</link><dc:creator>brandonspark</dc:creator><comments>https://news.ycombinator.com/item?id=38351195</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38351195</guid></item></channel></rss>