功能一流的功能

时间:2014-12-08 00:03:57

标签: php type-theory

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

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

在哪里添加将是一个功能,我不需要控制它的arity,就像它是一元一样,并通过currying工作。但是当我处理接收多个参数的函数时,我的问题出现了。我们以一个在屏幕上输出名称的简单函数为例:

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

$say_name需要 1个唯一参数,但我怎么断言它会接收 n 参数, n 是arity这个匿名函数?

$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 }的内容。有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

解决了ReflectionFunction

的使用问题
 $add = function($x, $y) { return $x + $y; };
 $x = new ReflectionFunction($add);
 $args = $x->getParameters();
 var_dump(count($args)); // 2