如何将 make Currying 与 PHP 绑定? (就像 JavaScript 中的 Function.prototype.bind 一样)?

发布于 2024-12-13 12:57:34 字数 377 浏览 0 评论 0 原文

我想要 https://developer.mozilla.org/en/JavaScript PHP 中的 /Reference/Global_Objects/Function/bind#Currying

$x = function ($a, $b) {
  echo $a . ' ' . $b;
};

for ($i= 0;$i< 10;$i++) {
  $y = bind($x, $i)// how?
  $y($i);
}

i want https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind#Currying in PHP:

$x = function ($a, $b) {
  echo $a . ' ' . $b;
};

for ($i= 0;$i< 10;$i++) {
  $y = bind($x, $i)// how?
  $y($i);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

镜花水月 2024-12-20 12:57:34

实际的柯里化对于 PHP 来说可能有点牵强 (;-)),尽管如此,您可以使用 PHP 5.3+ 中的闭包做这样的事情:

function populatedList() {
    $args = func_get_args();
    return function () use ($args) {
        $localArgs = func_get_args();
        return array_merge($args, $localArgs);
    };
}

$sevenList = populatedList(7, 14, 21);

var_dump($sevenList('foo', 'bar', 'baz'));

// Array
// (
//    [0] => 7
//    [1] => 14
//    [2] => 21
//    [3] => foo
//    [4] => bar
//    [5] => baz
// )

Actual currying is maybe a bit of a stretch for PHP (;-)), nonetheless you can do stuff like this with Closures in PHP 5.3+:

function populatedList() {
    $args = func_get_args();
    return function () use ($args) {
        $localArgs = func_get_args();
        return array_merge($args, $localArgs);
    };
}

$sevenList = populatedList(7, 14, 21);

var_dump($sevenList('foo', 'bar', 'baz'));

// Array
// (
//    [0] => 7
//    [1] => 14
//    [2] => 21
//    [3] => foo
//    [4] => bar
//    [5] => baz
// )
如果没有你 2024-12-20 12:57:34

也许您正在寻找匿名函数

例子:

<?php
    $greet = function($name)
    {
        printf("Hello %s\r\n", $name);
    };

    $greet('World');
    $greet('PHP');
?>

Perhaps Anonymous functions are what you are looking for?

Example:

<?php
    $greet = function($name)
    {
        printf("Hello %s\r\n", $name);
    };

    $greet('World');
    $greet('PHP');
?>
歌枕肩 2024-12-20 12:57:34

function-php 库有一个 柯里化(来自文档)

由于 PHP 允许可选参数,因此您可以决定是否要柯里化它们。默认是不柯里化它们。

使用函数Functional\curry;

函数添加($a,$b,$c = 10){
    返回$a+$b+$c;
}

// 仅柯里化必需参数,默认情况下,$c 始终为 10
$curriedAdd = curry('add', true);

// 这次,3 个参数将被柯里化。
$curriedAddWithOptional = curry('add', false);

从PHP7开始,“统一变量语法”的实现,可以大大简化柯里化函数的使用。

使用函数Functional\curry;

函数添加($a,$b,$c,$d){
    返回$a+$b+$c+$d;
}

$curriedAdd = curry('add');
$curredAdd(10)(5)(27)(10); //-> 52

The functional-php library has a class for currying (from the Docs):

Since PHP allows for optional parameters, you can decide if you want to curry them or not. The default is to not curry them.

use function Functional\curry;

function add($a, $b, $c = 10) {
    return $a + $b + $c;
}

// Curry only required parameters, the default, $c will always be 10
$curriedAdd = curry('add', true);

// This time, 3 parameters will be curried.
$curriedAddWithOptional = curry('add', false);

Starting with PHP7 and the implementation of the "Uniform variable syntax", you can greatly simpliy the usage of curried functions.

use function Functional\curry;

function add($a, $b, $c, $d) {
    return $a + $b + $c + $d;
}

$curriedAdd = curry('add');
$curriedAdd(10)(5)(27)(10); // -> 52
狂之美人 2024-12-20 12:57:34

从 php5.3 开始,您可以使用“use”关键字将柯里化参数传递到返回函数的范围:

$add = function ($a) {
    return function ($b) use ($a) {
        return $b + $a;
    };
};

var_dump($add(2)(3)); // int (5)

Since php5.3 you can use the "use" keyword to pass the curried argument to the scope of the returned function:

$add = function ($a) {
    return function ($b) use ($a) {
        return $b + $a;
    };
};

var_dump($add(2)(3)); // int (5)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文