Прежде всего, ожидаемый результат не должен быть примерно таким:
Value is now: 3
Value is now: 4
bad computation happens
Value is now:
Value is now:
Value is now:
Это связано с тем, что при следующем вызове после $bad_result
вы вызываете закрытие add1
, которое добавляет 1 кваш вывод null + 1 = 1
.
Таким образом, ожидаемый результат должен быть примерно таким:
Value is now: 3
Value is now: 4
bad computation happens
Value is now:
Value is now: 1
Value is now: 2
Это все происходит, потому что вы возвращаете new Maybe(NULL);
Как вы ожидаетевыполнить обратные вызовы после неудачного вычисления, когда вы просто не вызываете их?
помните, начиная с обратного вызова $bad_result
вы получаете нулевое значение, поэтому каждый вызов метода map
всегда будет выполнять else
оператор, который является new Maybe(NULL);
, который ничего не вызывает.
Вместо этого вам нужно будет Maybe($fn(null));
, чтобы убедиться, что вы будете вызывать ваш вызываемый объект для каждой итерации.
Комуполучите точный ожидаемый результат:
Value is now: 3
Value is now: 4
bad computation happens
Value is now:
Value is now:
Value is now:
вам нужно будет проверить $value
в ваших замыканиях, особенно закрытие add1
.
что-то вроде:
return !$value ? null : $value + 1;