Re: pipes, scalar objects and on?

From: Date: Tue, 18 Jul 2023 12:57:19 +0000
Subject: Re: pipes, scalar objects and on?
References: 1 2 3 4 5  Groups: php.internals 
Request: Send a blank email to internals+get-120833@lists.php.net to get a copy of this message
2023-07-17 21:57 GMT+02:00, Larry Garfield <larry@garfieldtech.com>: > On Mon, Jul 17, 2023, at 7:07 PM, Olle Härstedt wrote: >> 2023-07-17 18:58 GMT+02:00, Larry Garfield <larry@garfieldtech.com>: >>> On Mon, Jul 17, 2023, at 2:57 PM, Olle Härstedt wrote: >>>> 2023-07-17 14:25 GMT+02:00, Karoly Negyesi <karoly@negyesi.net>: >>>>> Hi, >>>>> >>>>> I tried to read on why the pipe RFC failed but by and large I also >>>>> failed. >>>>> >>>>> The discussion on >>>>> https://github.com/php/php-src/pull/7214 is very >>>>> short. >>>>> >>>>> https://externals.io/message/114770 is not so >>>>> short but it seems not >>>>> to >>>>> cover the latest version which uses first class functions? >>>>> >>>>> Could someone please give me a summary why it failed? I really would >>>>> like >>>>> to see it succeed :) I am writing code if not daily but certainly >>>>> weekly >>>>> that certainly looks like a pipeline. >>>> >>>> The pipe RFC was kinda forced in before a deadline, no? >>>> >>>> My own two cents: >>>> >>>> * It's trivial to implement a pipe() function or a Pipe class >>>> * A Pipe class is better than both a function and built-in operator, >>>> since it can be configured with custom behaviour, e.g. stop or throw >>>> on empty payload, or repeat on a collection, or even with parallelism >>>> or concurrency >>>> * If I had voting rights, I'd vote in favor in a pipe operator :) >>> >>> From my recollection, there were a couple of things involved. >>> >>> 1. It was intended to pair with the PFA RFC, which didn't pass, which >>> made >>> it a bit less compelling. >>> 2. It was close to the RFC deadline, and it seems people get squeamish >>> around that. >>> 3. Some folks wanted Hack-style pipes instead of the pipes used by every >>> other language with pipes. I've written before on why that's a worse >>> design. >>> 4. Arguments that it can be done in user space, which is not true, as I >>> have >>> a user-space implementation and it's comparatively cumbersome and >>> definitely >>> slower than a native operator would be. >>> 5. General "meh" attitude on FP features in general from some people. >>> >>> Side note to Olle: If you want a customizable pipe, you've just described >>> a >>> Monad. :-) It's literally "contextually-sensitive func concatenation." >>> A >>> monadic bind operator would be harder to do with PHP's weaker type >>> system, >>> but there are ways it could be done. >> >> Mm I don't really agree with that, I think monads make sense only in >> languages which support them syntactically. A Pipe class is a very >> straight-forward construction, and the blog posts I've read about >> monads in PHP don't look pretty at all; lots of syntactic noise going >> on. But that's another discussion... :) > > At its most basic: > > class Foo { > public function __construct(public readonly mixed $val) {} > > public __bind(callable $c) { > return $c($this->val); > } > } > > new Foo('beep') >>= func(...); > > Where >>= is the operator that translates to "Call __bind() on the LHS > object with the callable on the RHS." Poof, we now have a monad operator.. > This one is effectively the same as |> as it doesn't do anything, but you > can do whatever you want in the __bind() method. 1. You also want syntactic sugar around this to "flatten" monadic usage; in OCaml it's let*. 2. This way you won't get read-process-write pipelines as first-class values, which you can do if you just make a Pipe class instead. I think. Correct me if I'm wrong. :) Olle

« previous php.internals (#120833) next »