1

我正在重写 PHP 类型系统并致力于实现更纯粹的语言。我正在尽可能多地实现纯粹主义作为功能性和面向对象的语言,如方法链、作为对象的类型、消息传递、作为方法的条件和一些其他特性http://github.com/haskellcamargo /生。在这里,函数将是 Func类的实例,在我为它做一个转译器之后,因为 PHP 已经走到了现在。Func将不限于将一元函数作为参数,但会在调用时检查参数的数量是否与预期参数的数量完全匹配:

$add = Func(function(Number $x) {
  return Func(function(Number $y) use ($x) {
    return $x -> add ($y);
  });
});

其中 add 将是一个我不需要控制它的元数的函数,因为它是一元的并且通过柯里化工作。但是当我使用接收多个参数的函数时,我的问题就出现了。让我们以一个在屏幕上输出名称的简单函数为例:

$say_name = Func(function(String $name) {
  $name -> outputln();
});

$say_name需要1 个唯一参数,但我如何断言它将接收n 个参数,即这个匿名函数的数量?

$say_name -> invoke("Test");可能有效,但$say_name -> invoke("Test", 1);也有效,因为我没有办法了解匿名函数的数量。

function () { return func_num_args(); }

这将返回传递给它的参数数量。我需要知道所需参数的数量x,例如:

function x(Int $i, Functor $j) { return a_magic_function_that_returns_it_all(); }

并输出我类似的东西array(2) { [0]=> Int [1]=> Functor }。有人可以帮我吗?

4

1 回答 1

1

通过使用解决ReflectionFunction

 $add = function($x, $y) { return $x + $y; };
 $x = new ReflectionFunction($add);
 $args = $x->getParameters();
 var_dump(count($args)); // 2
于 2014-12-08T00:31:52.083 回答