【问题标题】:function that uses list comprehensions to generate a list of lists in Haskell在 Haskell 中使用列表推导生成列表列表的函数
【发布时间】:2014-10-20 00:53:05
【问题描述】:

我想编写一个使用列表推导生成列表的函数,其工作方式如下:

makeList 3 == [[1],[1,2],[1,2,3]]
makeList 5 == [[1],[1,2],[1,2,3],[1,2,3,4],[1,2,3,4,5]]
makeList (-2) == []

我最终得到了这个解决方案,但它显然没有给我从问题中需要的东西:

let makelist x = [x | x <- x, y <- [1..x]]

所以如果我输入这个

Prelude> makelist [3]

输出将如下所示:

[3,3,3]

我想先成为列表中的列表,然后我希望它增加。谢谢你的帮助!

【问题讨论】:

  • 首先,重用变量名可能不是最好的做法。 makelist x = [x | x &lt;- x, ...] 不是好习惯。

标签: list haskell list-comprehension


【解决方案1】:

让我们先尝试生成一个内部列表,有一些限制m

> let inner m = [1..m]
> inner 5
[1,2,3,4,5]

现在,请注意您的外部列表,对于某些限制 n,是 [inner 1, inner 2, inner 3, ..., inner n],或者,在列表理解形式中:

> let outer n = [inner m | m <- [1..n]]
> outer 3
[[1], [1,2], [1,2,3]]

所以我们可以将两者组合成一个列表理解表达式:

> let makeList n = [[1..m] | m <- [1..n]]
> makeList 4
[[1],[1,2],[1,2,3],[1,2,3,4]]

【讨论】:

    【解决方案2】:

    我建议你这样做:

    make_list n = [ [1..m] | m <- [1..n] ]
    

    但是在您的第一次尝试中有些奇怪:

    make_list x = [x | x <- x, y <- [1..x]]
    

    你把 x 用于各种目的。就是感觉不对。

    【讨论】:

      【解决方案3】:

      也是基于列表生成的递归版本,

      makeList' :: Int -> [[Int]]
      makeList' n
        | n < 1 = []
        | otherwise = [1..n] : makeList' (n-1)
      
      
      makeList :: Int -> [[Int]]
      makeList n = reverse $ makeList' n
      

      makeList' 以相反的顺序返回期望的结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-24
        • 2018-10-16
        • 1970-01-01
        • 2016-06-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多