ハックでアンダースコアからreduce関数を実装しようとしています。アンダースコアでは、reduce 関数は次の動作をします。
reduce の最初の呼び出しにメモが渡されない場合、iteratee はリストの最初の要素で呼び出されません。代わりに、リスト内の次の要素に対する iteratee の呼び出しで、最初の要素がメモとして渡されます。
関数を実装する私の試み:
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)