Php 管道函数上的意外输出
我试图在PHP上模拟Maybe monad,但我无法理解我编写的管道函数的输出 代码的灵感来自于 php-v//php7.2.19-0 ubuntu0.18.04Php 管道函数上的意外输出,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
预期结果如下:
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
闭包,该闭包将向输出中添加1null+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))相反,要确保每次迭代都调用callable
要获得准确的预期结果,请执行以下操作:
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
。哦,当然,我没有调用它们。天哪,我现在觉得自己很笨。感谢您的早期回复!