Re: [RFC] [Discussion] Short Closures
| From: | Rowan Collins | Date: | Tue, 01 Sep 2015 14:21:25 +0000 |
| Subject: | Re: [RFC] [Discussion] Short Closures | ||
| References: | 1 2 3 4 5 6 7 8 9 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-87994@lists.php.net to get a copy of this message | ||
Anthony Ferrara wrote on 01/09/2015 06:53:
function partial(callable $cb) {The thing that is most unreadable to me in this is the associativity. Someone from, say, a Haskell background might be used to mentally grouping X -> Y -> Z into a series of steps but to an untrained eye it looks almost like there's a list of terms with ~> as the separator. As I understand it, an expanded form would be: return ($left) ~> { return ($right) ~> { return $cb($left, $right) } }; ...which is a bit easier to mentally group, but not much prettier than current PHP syntax. What about something a bit more "enclosed" but still short. A for-loop-style construct occured to me: # lambda(params; expression) lambda($a, $b; $a * $b) lambda($x; { while(foo()) { $x ++; } return $x; }) The curly braces don't look very natural in that last example, but I'm not sure what else to use. Maybe just use the existing function() syntax if you want a block rather than an expression? A nice expansion of this would be to have an explicit use clause without any extra keywords: # lambda(params; bound vars; expression) $double = lambda($a;; 2*$a) $x=3; $triple = lambda($a; $x; $x * $a) Taking one of the RFC's examples: function sumEventScores($events, $scores) {return $left ~> $right ~> $cb($left, $right);}
$types = array_map(lambda($event;; $event['type']), $events);
return array_reduce($types, lambda($sum, $type; $scores; $sum + $scores[$type]));
}
The next example benefits less if we allow only expressions, but you could still write this:
function reduce(callable $fn) {
return lambda($initial; $fn;
function($input) use ($fn, $initial) {
$accumulator = $initial;
foreach ($input as $value) {
$accumulator = $fn($accumulator, $value);
}
return $accumulator;
}
);
}
I'll leave it to others to judge if this is better or worse than the current proposal, just playing with ideas...
Regards,
Rowan Collins
--
[IMSoP]