‹ BackHN Continuity

Thread

Effect 4.0

87 points · 70 comments · stevefan1999

  1. claude-ai · · focus · HN ↗
    Three clicks, no info what effect 4.0 is, except that it's AI-ready, safe, good, and re-built from the ground up. No idea what it actually is.
    1. verdverm · · focus · HN ↗
      fiber/effects for UI and event bus, eg. OpenCode's opentui and harness are built on this library, been using the 4-beta whilst hacking on some OpenCode plugins
      1. claude-ai · · focus · HN ↗

        [dead]

    2. slopinthebag · · focus · HN ↗
      it's for people who want to write ocaml or rust, but in typescript for some reason
      1. nvme0n1p1 · · focus · HN ↗
        It does seem like they're boiling the ocean, for... whatever reason programmers do these things.

        Rebuild JS&#x27;s core data structures: <a href="https:&#x2F;&#x2F;effect.website&#x2F;docs&#x2F;v4&#x2F;api&#x2F;effect&#x2F;Array" rel="nofollow">https:&#x2F;&#x2F;effect.website&#x2F;docs&#x2F;v4&#x2F;api&#x2F;effect&#x2F;Array

        Then rebuild the entire JS ecosystem on top of their custom data structures.

        And then the main heading on their home page is &quot;Reliable TypeScript for the AI era&quot;? Really? I&#x27;ll pass.

        1. maleldil · · focus · HN ↗
          It literally says:

          &gt; Works with JavaScript arrays

          1. nvme0n1p1 · · focus · HN ↗
            Yes but why? Why should I import a giant dependency to do this:

              a = [1, 2, 3];
              foo = effect.Array.append(a, 4);
            
            instead of using what&#x27;s built in to the language?

              a = [1, 2, 3];
              foo = [...a, 4];
            1. slopinthebag · · focus · HN ↗
              did you read the docs? it says

              &quot;Use when you need to guarantee a non-empty result after adding a required trailing value.&quot;

              ...whatever that means lol

              1. spaethnl · · focus · HN ↗
                The types allow you to very narrowly define functions so that you can, for example, require that a NonEmptyArray be passed. This helps to fulfill that requirement without casts.
              2. itishappy · · focus · HN ↗
                NonEmpty is a type that allows you to distinguish between:

                    a = [undefined];
                    res = a.pop() &#x2F;&#x2F; undefined
                
                    a = [];
                    res = a.pop() &#x2F;&#x2F; undefined
                1. skeledrew · · focus · HN ↗
                  As a Python person, that 2nd one looks like a bug. Expecting an exception there. Although also Python doesn&#x27;t have an `undefined`; `None` would have to suffice.
                  1. spaethnl · · focus · HN ↗
                    That 2nd one being a bug is exactly what the type system and NonEmpty types is designed to help prevent.
                    1. skeledrew · · focus · HN ↗
                      Not really. If you try to take something from an empty container (language or real life) then you should get an error&#x2F;issue. The container type doesn&#x27;t change when it&#x27;s empty, and the operation is just senseless; all that&#x27;s happening here is added mental gymnastics that makes code unintuitive to read. Checking if&#x2F;asserting a container isn&#x27;t empty is a straight forward `if cont: ...` or `assert cont` in Python, which anyone can just get.
                      1. itishappy · · focus · HN ↗
                        Right, you can attempt to take and potentially error, but if you already know that taking is possible you can skip the noise and simply return a result. Checking if your container is empty every time you remove an item is not free.
                      2. spaethnl · · focus · HN ↗
                        The type soft-enforces₁ it immediately for everyone though.

                        Without the type there are a few possibilities: 1. I could forget the assertion and have buggy code without realizing. 2. I could ensure that all uses do the assertion. Even if we can statically know that it is empty. This costs us the check for every call of the function, and ends up being more code.

                        Alternatively I could statically know in advance. The code won&#x27;t let me `Array.pop` because that is invalid, so:

                          1. I *cannot* make that mistake
                          2. It cost no runtime performance
                          3. It cost no extra code in a function
                        
                        1: I say soft-enforce because if someone were to pass a value incorrectly cast as NonEmpty, it would still have a runtime error, but that is a bug elsewhere, not here.
            2. itishappy · · focus · HN ↗
              You wouldn&#x27;t. Effect isn&#x27;t an array library.
        2. slopinthebag · · focus · HN ↗
          part of it is because js is a throwing language, and since there are no &quot;checked&quot; exceptions they need to basically rebuild the universe in their paradigm.

          but they seem to want to rebuild everything, eg

          &gt; The Console service exposes common console methods such as logging, warnings, errors, groups, counters, tables, and timers. Because console access goes through a service, programs can use custom console implementations in tests or other environments. This module also includes scoped helpers that close console groups or timers automatically.

          yeah idk mate

          1. spaethnl · · focus · HN ↗
            This is super useful though. It allows you to swap out implementations for things like logging and monitoring. Not sure what the confusion is here.
            1. bbg2401 · · focus · HN ↗
              Petty aside: Several JS people I know who were previously quite down on using a dependency injection framework are now seeing the benefits after adopting Effect. The most egregious example being a colleague who considered the adaption of DI tooling to be a language-level defect. It’s now one of his primary selling points for Effect.
              1. slopinthebag · · focus · HN ↗
                i wouldn&#x27;t consider the opinions of people who consider themselves &quot;js people&quot; to be particularly interesting, considering the ultimate state of that ecosystem. i say that as someone who writes js professionally.
            2. slopinthebag · · focus · HN ↗
              you dont need an entire runtime to implement polymorphic console.logging. tbh the fact they want to implement the world to do this is more of an inditement against this approach than anything else
              1. spaethnl · · focus · HN ↗
                It isn&#x27;t a case of wanting to implement the world to do this though.

                Instead, it is a case of the active users of the library saying, &quot;Wow, the Effect way of doing this is so much nicer, can we have everything this way please?&quot;

          2. itishappy · · focus · HN ↗
            Console is the very core of what I expect an effect system to need to reimplement.

            Console is IO and IO is the effect.

            1. slopinthebag · · focus · HN ↗
              just use a dependency injected logger then...
              1. ezst · · focus · HN ↗
                Not playing devil&#x27;s advocate or anything, but effect systems go beyond DI: it&#x27;s not just about passing around a capability, but managing its lifecycle in a referentially transparent manner, i.e. monads all the way down. It&#x27;s a real pain, but they set themselves up to bear the burden, so, good for the rest of us I guess?
    3. amelius · · focus · HN ↗
      It&#x27;s made with Npm, which makes me wonder if it&#x27;s really safe ...

      But I only read the news when it comes to npm, so maybe my fear is not justified.

      1. tiagod · · focus · HN ↗
        What do you mean by &quot;made with npm&quot;?
        1. amelius · · focus · HN ↗
          Uses npm for package management.
      2. jazzypants · · focus · HN ↗
        Almost every single JavaScript package is on NPM. Being on NPM does not automatically increase your attack vectors. The vast majority of the npm attacks have been &quot;Supply Chain Attacks&quot;[0] where an upstream dependency is injected with malicious code, then automatically downloaded and executed when users update a package.

        If you look at Effect&#x27;s package.json on GitHub[1], you&#x27;ll see that they have several &quot;devDependencies&quot;, but no regular &quot;dependencies&quot;. That means, unless you are working on the package itself, using it does not require downloading any other packages whatsoever. Thus, Effect is not susceptible to any of the issues that you have read about in the news. The only way malicious code could be transported through the package would be if the maintainers suddenly became evil.

        That being said, I don&#x27;t use Effect and I think it&#x27;s kind of overrated by the FP community. But, I appreciate the ideas behind it, and I felt the need to educate you about your needless fear of any library simply existing on NPM.

        [0] <a href="https:&#x2F;&#x2F;unit42.paloaltonetworks.com&#x2F;monitoring-npm-supply-chain-attacks&#x2F;" rel="nofollow">https:&#x2F;&#x2F;unit42.paloaltonetworks.com&#x2F;monitoring-npm-supply-ch...

        [1] <a href="https:&#x2F;&#x2F;github.com&#x2F;Effect-TS&#x2F;effect&#x2F;blob&#x2F;main&#x2F;package.json" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;Effect-TS&#x2F;effect&#x2F;blob&#x2F;main&#x2F;package.json

    4. spaethnl · · focus · HN ↗

      [dead]

    5. WalterGR · · focus · HN ↗

      [dead]

    6. miguel-muniz · · focus · HN ↗
      Sometimes I use the wayback machine to visit marketing pages before the advent of AI, so I can get a better understanding of what they actually do instead of just a bunch of AI jargon.
    7. vantassell · · focus · HN ↗
      I had the same thought, until I realized the posted link is for their 4.0 release rather than their homepage.

      Their main page makes the product pretty clear.

      <a href="https:&#x2F;&#x2F;effect.website" rel="nofollow">https:&#x2F;&#x2F;effect.website

      1. SwellJoe · · focus · HN ↗
        Does it, though?

        I can&#x27;t parse this into meaning anything:

        &quot;Reliable TypeScript for the AI era

        Build production-ready systems your team can ship, customers can depend on, and AI agents can work with.&quot;

        OK, it&#x27;s written in TypeScript, I guess. Is it a library? What does it do?

        1. notpushkin · · focus · HN ↗
          I’ve had to click around a bit and I think this is a better summary: <a href="https:&#x2F;&#x2F;effect.website&#x2F;docs&#x2F;v4&#x2F;getting-started&#x2F;why-effect#the-effect-pattern" rel="nofollow">https:&#x2F;&#x2F;effect.website&#x2F;docs&#x2F;v4&#x2F;getting-started&#x2F;why-effect#th...

            import { Effect } from &quot;effect&quot;
            
            const divide = (a: number, b: number): Effect.Effect&lt;number, Error, never&gt; =&gt;
              b === 0
                ? Effect.fail(new Error(&quot;Cannot divide by zero&quot;))
                : Effect.succeed(a &#x2F; b)
            
            Effect.runSync(divide(4, 2)) &#x2F;&#x2F; =&gt; 2
          
          This seems to be similar in spirit to railway oriented programming (see e.g. <a href="https:&#x2F;&#x2F;returns.readthedocs.io&#x2F;en&#x2F;latest&#x2F;pages&#x2F;railway.html" rel="nofollow">https:&#x2F;&#x2F;returns.readthedocs.io&#x2F;en&#x2F;latest&#x2F;pages&#x2F;railway.html), but I’m not 100% confident here.
          1. exceptione · · focus · HN ↗
            Monad Maybe?
            1. notpushkin · · focus · HN ↗
              Kinda like that, but with the error branch having a value too. I think Result is the common name for this monad:

                type Result e v = Ok v | Err e
              
              <a href="https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Result_type" rel="nofollow">https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Result_type
      2. pohl · · focus · HN ↗
        Still can’t tell if it’s a language, library or framework
        1. itishappy · · focus · HN ↗
          Have you tried reading the big bold text at the top of the page?

          &gt; Reliable TypeScript for the AI era

          It is a library.

          1. aand16 · · focus · HN ↗
            You forgot the &#x2F;s
          2. oliwarner · · focus · HN ↗
            I&#x27;m with the sibling. A library for what? UI, backend, graphing, visual effects? What does this replace?
            1. hexasquid · · focus · HN ↗
              &quot;typed error handling, structured concurrency, resource safety, and observability, all from one composable core&quot;
              1. oliwarner · · focus · HN ↗
                Yes, I read that and left scratching my head. Does it also encabulate?

                Really reminded me of this classic pitch (and yes I know it&#x27;s not the original turbo encabulator).

                &gt; More over, whenever fluorescent score motion is required it may also be employed in conjunction with a drawn reciprocation Dingle arm to reduce sinusoidal depleneration. The Retro Encabulator has now reached a high level of development and it&#x27;s being successfully used in the operation of Millford Trunions. It&#x27;s available soon wherever Rockwell Automation products are sold.

                1. itishappy · · focus · HN ↗
                  Not understanding something is different from it having no meaning.
                  1. oliwarner · · focus · HN ↗
                    Absolutely, but there&#x27;s so little context offered to derive actual meaning. If you already know, it&#x27;s probably a lot easier.

                    And if multiple people are wondering what something fundamentally is, perhaps it&#x27;s the pitch, not the people.

            2. itishappy · · focus · HN ↗
              A library for effects. Algebraic effects, to be more precise.

              To be fair &quot;algebraic effects&quot; is part of my priors. If you don&#x27;t know what that is those specific words won&#x27;t help you, but the examples should!

          3. Incipient · · focus · HN ↗
            &gt;incredibly simple to build the API and a background worker process with Effect. I get logging, telemetry, error handling, concurrency, API doc generation, and more for free!

            But that can&#x27;t be a library? Must be a framework? (eg more batteries included)

            1. nateb2022 · · focus · HN ↗
              &gt; (eg more batteries included)

              That&#x27;s not the definition of a framework.

              You call a library. A framework calls you.

      3. airstrike · · focus · HN ↗

        [dead]

    8. 14u2c · · focus · HN ↗
      Not only that but the play tab is broken. The default example does not compile in their own playground. And I&#x27;m still not sure what this thing is.
      1. 0x20cowboy · · focus · HN ↗
        It’s got electrolytes.
    9. lenkite · · focus · HN ↗
      It is very AI friendy - has the painful AI generated corpo-speak all over most of its docs: bla-blah is XXX, not YYY, painfully-repeated ad-nauseam.

      Anyways, I understood it as a Typescript copy of Scala&#x27;s ZIO library.

Open on Hacker News to reply ↗

Unofficial Hacker News client; not affiliated with Y Combinator.