gpt4 book ai didi

haskell - 这个 ArrowLoop.loop 的定义是如何工作的?

转载 作者:行者123 更新时间:2023-12-03 11:42:18 26 4
gpt4 key购买 nike

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 的那个固定点(并且可能不止一个)。在我看来,这很接近魔术。还是我觉得太复杂了?

最佳答案

这与 fix 的标准定义相同。作品:

fix f = let x = f x in x

即,它在 exact same way fix does 中找到一个固定点: 递归。

例如,作为一个简单的例子,考虑 loop (\((),xs) -> (xs, 1:xs)) () .这就像 fix (\xs -> 1:xs) ;我们忽略我们的输入,并使用 d输出(此处为 xs)作为我们的主要输出。元组中的额外元素 loop has 只是包含输入参数和输出值,因为箭头不能进行柯里化(Currying)。考虑如何使用 fix 定义阶乘函数— 你最终会使用柯里化(Currying),但是当使用箭头时,你会使用额外的参数并输出 loop给你。

基本上, loop打结,让箭头访问自身的辅助输出,就像 fix打结,使函数可以访问自己的输出作为输入。

关于haskell - 这个 ArrowLoop.loop 的定义是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9856342/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com