【发布时间】:2015-03-02 23:21:36
【问题描述】:
在 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..] 行。
我不一定期望无点版本更短、更简洁甚至更具可读性。作为一个 Haskell 新手,我只是想了解它是如何实现的。
【问题讨论】:
-
Haskell 新手似乎爱上了无点风格。爱情是盲目的;你会从中成长。顺便说一句,这是一个不错的(不是无意义的)版本:
[[x * y | x <- [1..12]] | y <- [1..12]]。 -
@BenjaminHodgson 如果他玩得开心,为什么不让他玩呢?看看你能把一些编程技术或概念带到多远很有趣。最终是否实用,好吧,这并不重要。
-
Zeta 的回答在逐步改进中具有指导意义,这些改进从我的原始形式开始,以无点形式结束。丹尼尔的回答有一种吸引人的风格,我觉得非常直观。两个答案都很棒。谢谢。