gpt4 book ai didi

haskell - 你可以在haskell中使用列表理解一次创建多个列表元素吗?

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

因此,例如,假设我有一个数字列表,我想创建一个包含每个数字乘以 2 和 3 的列表。有没有办法做类似下面的事情,但取回一个数字列表而不是数字列表的列表?

mult_nums = [ [(n*2),(n*3)] | n <- [1..5]] 
-- this returns [[2,3],[4,6],[6,9],[8,12],[10,15]]
-- but we want [2,3,4,6,6,9,8,12,10,15]

最佳答案

我发现扩展列表理解使这更容易阅读:

[ m | n <- [1..5], m <- [2*n,3*n] ]

准确检查它的作用以及它与其他解决方案的关系可能会有所帮助。让我们将其定义为一个函数:
mult lst = [ m | n <- lst, m <- [2*n,3*n] ]

时尚之后,这个 desugars
mult' lst = 
concatMap (\n -> concatMap (\m -> [m]) [2*n,3*n]) lst

表达式 concatMap (\m -> [m])正在包装 m放在一个列表中以便立即将其展平——它相当于 map id .

将此与@FunctorSalad 的答案进行比较:
mult1 lst = concatMap (\n -> [n*2,n*3]) lst

我们已经优化了 concatMap (\m -> [m]) .

现在@vili 的回答是:
mult2 lst = concat [ [(n*2),(n*3)] | n <- lst]

这对:
mult2' lst = concat (concatMap (\n -> [[2*n,3*n]]) lst)

与上面的第一个解决方案一样,我们不必要地创建了一个列表列表,我们必须 concat离开。

我认为没有使用列表推导的解决方案,但对 mult1 进行了取消处理。 .我的直觉是,Haskell 编译器通常足够聪明,这无关紧要(或者,由于惰性评估,不必要的 concat 很便宜(而它们在急切的语言中是致命的))。

关于haskell - 你可以在haskell中使用列表理解一次创建多个列表元素吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/567840/

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