gpt4 book ai didi

haskell - 教会使用文件夹

转载 作者:行者123 更新时间:2023-12-02 09:03:02 24 4
gpt4 key购买 nike

我遇到了这段代码,它可以工作,但我不知道为什么。我将尝试传达我理解的部分,但我不了解全貌。这是代码:

church :: Int -> (c -> c) -> c -> c
church 0 _ arg = arg
church n f arg = foldr (\x acc -> f acc) arg [1..n]

在 Prelude 上运行此输入时,
church 4 tail "ABCDEFGH" 

这是答案:
"EFGH"

我知道 foldr 是如何工作的,我可以看一个 foldr 的例子:
foldr (/) 2 [8,12,24,4]

这里发生的是:
4/2 = 2, 24/2 = 12, 12/12 = 1, 8/1 = 8

我得到了所需的输出 8,如 this page 的第二个示例中所述。 :

至于这个问题,我知道为什么“EFGH”是答案。尾部被应用了四次,它是这样的:
tail "ABCDEFGH" = "BCDEFGH", 
tail "BCDEFGH" = "CDEFGH"
tail "CDEFGH" = "DEFGH"
tail "DEFGH" = "EFGH"

但是,在这段代码中,这是我写出来的过程:
foldr (\x acc -> tail acc) "ABCDEFGH" [1, 2, 3, 4]

根据我对 foldr 的描述以上, foldr应用尾部和 "ABCDEFGH"到 4,因为 4 是最后一个元素。但是,我无法理解 "ABCDEFGH"应用到 4 的尾部。在我的示例中,这很容易,因为 (/)划分 2 个元素,一个来自列表,另一个是第二个参数。但是,在此代码的情况下,tail 用于列表中的元素和另一个列表之间。我不明白这个。任何人都可以通过逐个元素来帮助我,就像我在示例中描述的那样?

最佳答案

请注意 x未在 -> 右侧的任何位置使用.因此,列表中的数字没有被使用。它可能是一个单位列表,但仍然可以正常工作:foldr (\x acc -> tail acc) "ABCDEFGH" [(), (), (), ()]该列表的唯一目的是对执行次数进行编码 tail在它的长度上。如果您更换 \x acc -> tail acc 也可能有助于您的理解与等价表达式 const tail .

关于haskell - 教会使用文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61649948/

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