Я пытаюсь реализовать функцию сокращения из подчеркивания в хаке. В подчеркивании функция сокращения ведет себя следующим образом:
Если при начальном вызове редукции не передается заметка, итерация не вызывается для первого элемента списка. Вместо этого первый элемент передается как памятка при вызове итерации для следующего элемента в списке.
Моя попытка реализовать функцию:
function reduce<T, Tresult>(
Iterable<T> $iterable,
(function(?Tresult, T):Tresult) $fn,
?Tresult $memo=null):?Tresult {
if (is_null($memo)) {
$memo = $iterable->firstValue();
$iterable = $iterable->skip(1);
}
foreach ($iterable as $value) {
$memo = $fn($memo, $value);
}
return $memo;
}
Это приводит к ошибке:
Invalid return type (Typing[4110])
This is a value of generic type Tresult
It is incompatible with a value of generic type T
via this generic Tv
Как сообщить программе проверки типов, что T == Tresult
когда is_null($memo)