public static function sieve($input, $paramPredicate) { $x = $input->first(); $cell = new Cell($x, null); $cell->cdr = function () use($input, $paramPredicate, $x) { return Cell::sieve($input->rest()->filter(function ($n) use($paramPredicate, $x) { return $paramPredicate($n, $x); }), $paramPredicate); }; return $cell; }