当前位置:  开发笔记 > 编程语言 > 正文

您是否可以在haskell中使用列表解析一次创建列表中的多个元素?

如何解决《您是否可以在haskell中使用列表解析一次创建列表中的多个元素?》经验,为你挑选了3个好方法。

所以,例如,假设我有一个数字列表,我想创建一个列表,其中包含每个数字乘以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]

Chris Conway.. 17

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

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

准确地检查它的作用以及它与其他解决方案的关系可能会有所帮助.让我们将其定义为一个函数:

mult lst = [ m | n <- lst, m <- [2*n,3*n] ]

经过一番时尚,这个去了

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离开的列表列表.

我不认为有一个解决方案使用列表推导,但是desugars来mult1.我的直觉是,Haskell编译器通常足够聪明,这无关紧要(或者,concat由于懒惰的评估,不必要的s很便宜(而在急切的语言中它们是致命的)).



1> Chris Conway..:

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

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

准确地检查它的作用以及它与其他解决方案的关系可能会有所帮助.让我们将其定义为一个函数:

mult lst = [ m | n <- lst, m <- [2*n,3*n] ]

经过一番时尚,这个去了

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离开的列表列表.

我不认为有一个解决方案使用列表推导,但是desugars来mult1.我的直觉是,Haskell编译器通常足够聪明,这无关紧要(或者,concat由于懒惰的评估,不必要的s很便宜(而在急切的语言中它们是致命的)).



2> vili..:

你可以使用concat.

concat [ [(n*2),(n*3)] | n <- [1..5]] 
output: [2,3,4,6,6,9,8,12,10,15]



3> FunctorSalad..:

在一些类似的情况下,concatMap也可以很方便,不过这里变化不大:

concatMap (\n -> [n*2,n*3]) [1..5]

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有