Skip to content
HomeVideosBooksBlogs
AllTop postsTopics
Podcasts
HistoryListsWatch laterLiked videosFollowing

The videos, books, blogs and podcasts Hacker News keeps recommending, all in one place.

VideosBooksBlogsPodcastsAboutPrivacySettings

Data from Hacker News, HackerTube, HackerBooks, HackerBlogs and Open Library. Credits · Not affiliated with Y Combinator.

HomeVideosBooksBlogsPodcasts
Ctrl K

    Conal Elliott

    conal.net · Personal blog · on HN since 2008

    Conal Elliott writes on functional programming, functional reactive animation, and compiling Haskell to categories and parallel hardware.

    Visit blogHN submissions
    Languages & CompilersProgramming
    What HN says

    HN commenters recommend his work on functional programming and list his site among favorite personal blogs.

    Stats for nerds
    156HN people shared it
    76linked in comments
    1Kstory points
    Jul 2026last shared
    2008people per year2026

    Top posts on HN

    1. 1
      Can functional programming be liberated from the von Neumann paradigm? (2010)
      9 people · 315 points · first shared 2010 · 82 comments on HN
    2. 2
      The C language is purely functional (2009)
      43 people · 273 points · first shared 2009 · 31 comments on HN
    3. 3
      The Simple Essence of Automatic Differentiation [pdf]
      2 people · 167 points · first shared 2018 · 16 comments on HN
    4. 4
      Push-pull Functional Reactive Programming (2009)
      5 people · 55 points · first shared 2010 · 1 comments on HN
    5. 5
      Composing Reactive Animations (1998)
      7 people · 39 points · first shared 2012 · 1 comments on HN
    6. 6
      A third view on trees
      2 people · 25 points · first shared 2011 · 2 comments on HN
    7. 7
      Semantic Editor Combinators
      4 people · 24 points · first shared 2009 · Discussion on HN
    8. 8
      Compiling Haskell to Massively Parallel Hardware [pdf]
      6 people · 14 points · first shared 2017 · 1 comments on HN
    9. 9
      Parallel Tree Scanning in Haskell
      2 people · 11 points · first shared 2011 · Discussion on HN
    10. 10
      Exact Numeric Integration
      1 person · 10 points · first shared 2010 · 2 comments on HN

    What HN people wrote when they linked it

    • cbenDec 2025

      Computers are not a kitchen. They are clay, they are Lego, they are jungles of imagination. It's true that our current trajectory devolves their universality to a set of discrete isolated applications == multiplexing a set of appliances on one device.

      That's an economic win sure, but it's tragic if we fail to unlock more of their flexibility for "end users"! IMHO that's the biggest unsolved problems of computer science: that it takes so much professional learning to unlock the real potential (and even that fails us programmers much of the time! How frequently do you say "I'll solve it myself" and the time invested is actually worth it? In the words of Steve Krouse we've not quite solved "End-programmer Programming" yet.)

      I do want FOSS to follow through and offer live inspectors for everything, but no, I no longer believe users should "learn to code" as the salvation. We're nowhere near it being worth their time, we actually went downhill on that :-( Conversational AI and "vibe using" will play a role, but that's more like "adversarial interoperability", doesn't cover what I mean either.

      I want cross-app interoperability to be designed in, as something everyone'd understand users want. I want agency over app state — snapshot, fork, rewind, diff etc. I want files back (https://jenson.org/files/), and more¹. I want things like versioning and collaboration to work cross-app. I want ideas and metaphors we haven't found yet — I mean it when I call it unsolved problem…

    • mrkeenApr 2024

      > As far as I know, one can create a denotational semantics for any well-defined language. In practical terms, you could pick, say, JavaScript and do a similar representation as explained in the article: Every “non-pure function” is evaluated to a description of the state change that is caused by that function.

      Yes this argument has been done before [1], so it's important not to lose sight of the real value proposition:

      I want the ability to write a function which returns the same output for the same input, regardless of when/where it's called, number of threads, whether it's in a test or in prod, and so on. But I can already do that in an any programming language, so the real value here is being able to mark the function as such, and have the compiler reject me if I'm wrong.

      > However, the more I look into this the less I buy into the whole “functional semantics” for side-effects argument. Immutable data is great, explicit dependencies are great, but those are about minimizing the use of side-effects, not about dressing them up.

      A function with minimal side-effects is a function with side-effects [2].

      > effectful computations are marked with an ! so they are easier to spot

      There's two important steps that you've rolled into one. The first step is the 'functional semantics (with explicit effects)'. E.g. you take your straight-line imperative program:

      html = Http.getUtf8(url); path = Path.fromStr(filename); File.writeUtf8(path, html); Stdout.line ("Wrote…

    • mananaysiempreNov 2023

      > You can replace bash with JS

      Noo-ot really except in a Turing-tarpit sort of way. Like it or not, once learned (!) Bourne shell together with the traditional tools is a well-designed user interface and works even better for that than, say, Tcl[1]. Not an automation or scripting language, a user interface for all daily interaction. I would absolutely hate to manually sort through my files in JS, while in shell I can often do it faster than in a GUI file manager.

      And, of course, it’s also a fairly strong contender as a programming language in the paradigm of many pipelined imperative processes—probably because that paradigm remains largely unexplored. I can only maybe name Icon as a viable competitor, and Icon’s also very nice. (Python, no matter how “inspired” it is by Icon, has traded its command of streams for more mainstream ease of use.) By comparison, the old complement of parallellized JS build tools (Gulp? Grunt? I forgot, it’s been a while) always surprised me with how awkwardly it accomplished shell-script-equivalent tasks.

      To be clear, it’s not that Bourne shell is good and JS is bad. JS is a passable Fortran[2], while shell is at best a marginally functional one—there’s a reason Awk exists. But shell competes in categories that most other languages don’t even try to qualify for.

      [Yes, I know about rc. I happen to think rc’s focus on one-level lists of strings (incidentally shared by Jam, an attempt at a better make) is a mistake, and more consistent…

    • User23Oct 2021

      Any imperative algorithm admits functional mathematical interpretations. While humorous, the observation that programming in C is purely functional[1] isn't wrong. Also consider, for example, that the formalism for the Turing Machine, the archetypical imperative automata, is purely functional.

      More seriously, the semantics of an imperative algorithm are perhaps always best understood as mathematical functions. Predicate transformer semantics reduce verifying an imperative program to proving a first-order formula. Leslie Lamport, who most people doing so-called "formal verification"[2] know for TLA+, is also a shining light in this area of research. They are observably complementary cognitive tools for the task of writing correct programs, even if one is attracting more grants. The trick is learning to write programs that reduce to formula that can practicably be solved, automatically or not.

      Granted, for many languages that first-order formula might be difficult to solve for many programs, but that doesn't change the fact that there exists a functional description of the procedure's semantics, even if the process the hardware actually executes isn't so analyzed[3]. But then that's true for Haskell too. It's just Haskell and its cousins do a comprehensive job of beating you over the head that you're reasoning about program semantics and not processes.

      [1] http://conal.net/blog/posts/the-c-language-is-purely-functional

      [2] Correctly it should be called automatic…

    • PeakerMar 2011

      I think saying that FP is bad for "manipulating state" is misleading.

      FP is great at manipulating state. A pure Haskell function (State -> State) manipulates state.

      What's being discussed is whether or not the state is manipulated destructively. And personally I don't see any real benefits to the destructive method, except performance issues in some cases, and arguably stylistic ones.

      Returning new values instead of in-place updates may seem cumbersome before you get to know the abstractions that make it easy to use.

      As an example, in Haskell, if you want to update a value deep inside multiple nested records, you do something like:

      movePlayer :: (Pos -> Pos) -> GameState -> GameState
      movePlayer f gs = gs { player = oldPlayer { position = f oldPos } }
      where
      oldPlayer = player gs
      oldPos = position oldPlayer

      That looks horrible, compared to something like:

      gs.player.position = f(gs.player.position);

      But then, if you discover the Semantic Editor Combinators abstraction (http://conal.net/blog/posts/semantic-editor-combinators/), then you can write that as:

      movePlayer :: (Pos -> Pos) -> GameState -> GameState
      movePlayer f = (atPlayer . atPosition) f

      or just:

      movePlayer = atPlayer . atPosition

      Then you can use:

      movePlayer (+delta)

      to add delta to the position.

      Now one nice thing about the return-new-value approach is that it is more composable than the destructive update approach. When you compose state…

    • RuskySep 2011

      Language innovation is tightly tied into computer science innovation. There are plenty of paradigms that are fundamentally different and quite potentially better than UNIX and LISP out there- you just need to get out of that rut.

      Mozilla's language [Rust](https://www.github.com/graydon/rust/wiki) is working on static verification (using typestate) and concurrency in a C/C++ level language.

      The Haskell community has several people ([Conal Elliot](http://conal.net), [Luke Palmer](http://lukepalmer.wordpress.com)) who are working on new models of functional I/O such as functional reactive programming.

      There is a lot of programming language innovation in parallel/concurrent programming that's just hitting mainstream- actor model, asynchronous programming, CUDA/OpenCL, etc.

      The way you talk to the machine is an extremely important part of "how to get problems solved." If you can't express something without absurd amounts of overhead, you're not going to solve the problem that way.

    Related

    Existential Typeexistentialtype.wordpress.com157 people

    Haskell Is Exceptionally Unsafe (2012)

    Existential Type
    Personal · last shared 2026
    Oleg Kiselyovokmij.org251 people

    How the OCaml type checker works (2022)

    Oleg Kiselyov
    Personal · last shared 2026
    Don Stewartdonsbot.wordpress.com40 people

    Back to old tricks, or, baby steps in Rust

    Don Stewart
    Personal · last shared 2020
    A Neighborhood of Infinityblog.sigfpe.com185 people

    Why is nuclear fusion so hard?

    A Neighborhood of Infinity
    Personal · last shared 2026
    Luke Palmerlukepalmer.wordpress.com35 people

    IDE WTF

    Luke Palmer
    Personal · last shared 2020
    Justin Leblog.jle.im36 people

    Typesafe Neural Networks in Haskell with Dependent Types

    Justin Le
    Personal · last shared 2026
    Philip Zuckerphilipzucker.com38 people

    The C bounded model checker: criminally underused

    Philip Zucker
    Personal · last shared 2026
    Brent Yorgeybyorgey.wordpress.com84 people

    Conversations with a six-year-old on functional programming

    Brent Yorgey
    Personal · last shared 2026