gpt4 book ai didi

haskell - (x*) 中的星号在 Haskell 中有什么作用?

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

我是 Haskell 的新手,有人可以向我解释一下这段代码是如何工作的吗?

f = g (\x -> x)
g k [] = k 100
g k (x:xs) = g ((x*) . k) xs
当我调用 f [1..5]它返回 12000。我不明白为什么。 (x*) 是什么意思做?

最佳答案

您可以扩展定义,并观察发生了什么。

f [1..5]
= g (\x -> x) [1..5]
= g ((1*) . (\x -> x)) [2..5]
= g ((2*) . (1*) . (\x -> x)) [3..5]
= g ((3*) . (2*) . (1*) . (\x -> x)) [4..5]
= g ((4*) . (3*) . (2*) . (1*) . (\x -> x)) [5]
= g ((4*) . (3*) . (2*) . (1*) . (\x -> x)) [5]
= g ((5*) . (4*) . (3*) . (2*) . (1*) . (\x -> x)) []
= ((5*) . (4*) . (3*) . (2*) . (1*) . (\x -> x)) 100
= ((5*) . (4*) . (3*) . (2*) . (1*)) 100
= ((5*) . (4*) . (3*) . (2*)) 100
= ((5*) . (4*) . (3*)) 200
= ((5*) . (4*)) 600
= (5*) 2400
= 12000
请注意 (x*)是函数“乘以 x”,即 \y -> x*y , 而运算符 .是功能组合。所以作文链 (5*) . (4*) . ... . (1*)是函数“将输入乘以 1,然后乘以 2,然后乘以 3,...,然后乘以 5”。
您的代码是用所谓的连续传递样式 (CPS) 编写的,我们不是从初始值 (100) 开始并向其应用函数,而是执行(尾)递归调用并将一些函数“附加”到当前“继续” k (在您的代码中使用 (x*) . k)。这样做会构建一长串组合函数,并且仅在最后我们将该链应用于初始值(100)。一般来说,这种代码风格不是特别容易阅读。

关于haskell - (x*) 中的星号在 Haskell 中有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68695059/

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