gpt4 book ai didi

haskell - pointfree Haskell 中通过映射的乘法表

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

在 Haskell 中,我定义了一个乘法表生成器函数,如下所示:

multTable :: [[Int]]
multTable=map (\b -> map (b*) [1..12]) [1..12]

哪个输出...

[[1,2,3,4,5,6,7,8,9,10,11,12],
[2,4,6,8,10,12,14,16,18,20,22,24],
...[12,24,36,48,60,72,84,96,108,120,132,144]]

...如果你眯起眼睛,这看起来就像 1..12 的乘法表。到目前为止一切都很好……现在我尝试让它变得无点,认为构图应该很容易。因此,我正在采取一些小步骤,并且我相信我已经完成了一半,因为我可以做到这一点:

map ($ 4) $ map (*) [1..12]

...这给了我:

[4,8,12,16,20,24,28,32,36,40,44,48]

看看这个,第二个映射给出了 [a->a],这里具体来说是一个函数列表,它将值 1 到 12 乘以某个数字。第一个映射评估每个函数,为它们提供值 4,进而生成 [4,8..] 行。

我并不一定期望 pointfree 版本更短、更简洁或更易读。作为 Haskell 新手,我只是想了解如何实现它。

最佳答案

有一个名为 pointfree 的工具关于 hackage,这对您有很大帮助(另请参阅 the wiki )。它创建以下版本:

multTable = map (flip map [1..12] . (*)) [1..12]

我们如何到达那里?好吧,让我们稍微移动一下运算符,并尝试在您的函数上应用 flip ,直到我们得到类似的结果:

multTable = map (\b -> map (b*) [1..12])           [1..12] 
= map (\b -> map ((*) b) [1..12]) [1..12] -- change to prefix notation
= map (\b -> flip map [1..12] ((*) b) [1..12] -- flip map
= map (\b -> flip map [1..12] . (*) $ b) [1..12] -- associativity
= map (flip map [1..12] . (*)) [1..12] -- eta-reduction

请注意,我们只需要关注 \b -> map (b*) [1..12]

话虽如此,pointfree 版本感觉有点做作。毕竟,您想要一张 table ,并且 Benjamin's shows a rather nice way创建一个:列表推导式:

multTable = [[x * y | x <- [1..12]] | y <- [1..12]]

这个版本更容易阅读,对读者来说也更明显,但话又说回来,您可能认为会发生这种情况:

I'm not necessarily expecting the pointfree version to be shorter, more concise or even more readable.

关于haskell - pointfree Haskell 中通过映射的乘法表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28821283/

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