ArrowLoop
包含的函数实例
loop :: ((b,d) -> (c,d)) -> (b -> c)
loop f b = let (c,d) = f (b,d) in c
首先我对签名有一个问题:我们怎么可能b -> c
从(b,d) -> (c,d)
? 我的意思是,c
结果元组中的 可能取决于输入的两个元素,如何“切断” 的影响d
?
其次,我不明白let
这里的工作原理。不包含(c,d) = f (b,d)
的循环定义d
?从哪里来d
?老实说,我很惊讶这是有效的语法,因为看起来我们会重新定义d
.
我的意思是在数学中这是有道理的,例如 f 可能是一个复杂的函数,但我只会提供实部 b,并且我需要选择虚部 d 以使其在我不会改变时评估 f (b,d),这将使它成为某种固定点。但是,如果这个类比成立,则let
表达式必须以某种方式“搜索”d 的那个不动点(并且可能不止一个)。在我看来,这很接近魔术。还是我觉得太复杂了?