ArrowLoop包含的函数实例
loop :: ((b,d) -> (c,d)) -> (b -> c)
loop f b = let (c,d) = f (b,d) in c
Run Code Online (Sandbox Code Playgroud)
首先,我有签名一个问题:我们如何能够得到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的固定点(并且可能有多个).这对我来说看起来很神奇.或者我觉得太复杂了?
ehi*_*ird 14
这与标准的fix工作定义相同:
fix f = let x = f x in x
Run Code Online (Sandbox Code Playgroud)
也就是说,它的发现在一个固定的点完全相同的方式fix做:递归.
例如,作为一个简单的例子,考虑一下loop (\((),xs) -> (xs, 1:xs)) ().这就像fix (\xs -> 1:xs); 我们忽略输入,并使用d输出(此处xs)作为主输出.元组中的额外元素loop只是包含输入参数和输出值,因为箭头不能进行currying.考虑一下你如何定义一个阶乘函数fix- 你最终会使用currying,但是当你使用箭头时,你会使用额外的参数和输出loop给你.
基本上,loop绑一个结,让箭头访问自己的辅助输出,就像fix绑一个结,给一个函数访问自己的输出作为输入.