簡體   English   中英

使用列表推導在Haskell中生成列表列表的函數

[英]function that uses list comprehensions to generate a list of lists in Haskell

我想編寫一個使用列表推導來生成列表列表的函數,其工作方式如下:

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]

我希望先成為列表中的列表,然后我希望它能夠增加。 謝謝你的幫助!

讓我們先嘗試生成一個內部列表,對於某些限制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]]

我建議你這個:

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

然而,在你的第一次嘗試中有一些奇怪的東西:

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

在那里你把x用於各種目的。 這只是感覺不對。

基於列表生成的遞歸版本,

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


makeList :: Int -> [[Int]]
makeList n = reverse $ makeList' n

makeList'以相反的順序返回所需的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM