Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 管道函数上的意外输出_Php_Functional Programming - Fatal编程技术网

Php 管道函数上的意外输出

Php 管道函数上的意外输出,php,functional-programming,Php,Functional Programming,我试图在PHP上模拟Maybe monad,但我无法理解我编写的管道函数的输出 代码的灵感来自于 php-v//php7.2.19-0 ubuntu0.18.04 预期结果如下: Value is now: 3 Value is now: 4 bad computation happens Value is now: Value is now: Value is now: 但我得到了: Value is now: 3 Value is now: 4 bad computation h

我试图在PHP上模拟Maybe monad,但我无法理解我编写的管道函数的输出

代码的灵感来自于

php-v//php7.2.19-0 ubuntu0.18.04


预期结果如下:

Value is now: 3
Value is now: 4
bad computation happens
Value is now: 
Value is now: 
Value is now: 
但我得到了:

Value is now: 3
Value is now: 4
bad computation happens 
我希望在
$bad\u result
函数之后放置的函数会被调用,但显然不是

打印
$result
变量时,输出为:

print\r($result);
//也许反对
// (
//[value:Maybe:private]=>
// )
变量转储($result->join());
//空的

有一颗明亮的灵魂能照亮我吗?

首先,预期的结果不应该是这样的:

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
这一切都是因为您正在返回
newmaybe(NULL)

当您只是不调用回调时,如何在错误的计算之后执行回调

请记住,从
$bad_result
回调开始,您将得到null,因此对
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
闭包

比如:

Value is now: 3
Value is now: 4
bad computation happens
Value is now: 
Value is now: 
Value is now: 

返回$价值null:$value+1

这在PHP5.x中也会发生。一旦值变为null,您总是返回
new Maybe(null)它不调用函数。涉及到几个部分,您不能单独测试它们吗?此外,在调试器中单步执行代码应该很早就给您一个错误方向的提示。也就是说,只是一个提示,您的代码没有以符合PSR的方式格式化,这使得其他人更难阅读,因此也更难理解。旁注:这不是单子,只是一个函子。您的
join
方法实际上被称为
cata
,因为它定义了
可能
类型的消除规则。一个合适的
连接
必须将两个单体层折叠成一个,即它必须返回一个
Maybe
。这似乎是
Maybe
类的全部要点。一旦得到一个无效值,就应该停止调用函数,这样就不会向它们传播无效输入。它不区分
$trace
和执行计算的函数,所以它不调用
$trace
。哦,当然,我没有调用它们。天哪,我现在觉得自己很笨。感谢您的早期回复!