gpt4 book ai didi

haskell - Haskell rec 关键字是如何工作的?

转载 作者:行者123 更新时间:2023-12-03 10:56:21 30 4
gpt4 key购买 nike

在箭头符号中,您可以使用 rec 关键字来编写递归定义。例如:

rec
name <- function -< input
input <- otherFunction -< name

这怎么能评价?似乎它只会进入无限循环或其他东西。我知道它计算为循环箭头组合器,但我也不明白它是如何工作的。

编辑:那个权力的例子真的很有帮助。但是,您将如何使用 do 表示法来编写它?我假设您需要使用rec。

最佳答案

由于haskells的懒惰,这一点魔术起作用。你可能知道,Haskell 在需要时评估一个值,而不是在定义时。因此,如果您不需要直接输入或稍后输入的值,则此方法有效。
rec使用 loop 实现ArrowLoop的功能.定义如下:

class Arrow a => ArrowLoop a where
loop :: a (b,d) (c,d) -> a b c

instance ArrowLoop (->) where
loop f b = let (c,d) = f (b,d) in c

可以看到:输出只是作为输入反馈回来的。它只会计算一次,因为 Haskell 只会计算 d需要的时候。

这是一个如何使用 loop 的实际示例直接组合器。此函数计算其参数的所有幂:
powers = loop $ \(x,l) -> (l,x:map(*x)l)

(你也可以这样写: powers x = fix $ (x :) . map (*x))

它是如何工作的?好吧,无限的权力列表在 l争论。评估如下所示:
powers = loop $ \(x,l) -> (l,x:map(*x)l) ==>
powers b = let (c,d) = (\(x,l) -> (l,x:map(*x)l)) (b,d) in c ==>
powers b = let (c,d) = (d,b:map(*b)d) in d ==> -- Now we apply 2 as an argument
powers 2 = let (c,d) = (d,2:map(*2)d) in d ==>
= let (c,(2:d)) = (d,2:map(*2)d) in c ==>
= let (c,(2:4:d)) = ((2:d),2:map(*2)(2:d)) in c ==>
= let (c,(2:4:8:d)) = ((2:4:d),2:map(*2)(2:4:d)) in ==> -- and so on

关于haskell - Haskell rec 关键字是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5405850/

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