Сложный вопрос понимания списка в Haskell - PullRequest
1 голос
/ 04 марта 2020

Я пытаюсь создать вложенный список, например, со списком:

[[1,2,3],[4,5,6],[7,8,9]] 

Я кодировал что-то вроде:

take 3 [take 3 [i .. ] | i <- [1 ..]]

, но это дает:

[[1,2,3],[2,3,4],[3,4,5]]

Как мне сделать так, как верхний?

Ответы [ 3 ]

7 голосов
/ 04 марта 2020

Синтаксис [1,4 ..] дает вам бесконечный список 1,4,7 (и так далее). Как только вы поняли, что синтаксис существует, это становится намного проще!

take 3 [ [x,x+1,x+2] | x <- [1,4 ..] ]

Должно дать

[[1,2,3],[4,5,6],[7,8,9]]

4 голосов
/ 04 марта 2020

Примерно так:

let n = 4 in take n [take n [(i * n + 1) .. ] | i <- [0 .. ]]

Что дает

[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]

Используя списочное понимание только , вы можете сделать это

let n = 4 in [[((i - 1) * n + 1) .. (i * n)] | i <- [1 .. n]]
2 голосов
/ 04 марта 2020

Вы можете обобщить до n таких элементов, как

chunksOf :: Int -> [[Int]]
chunksOf n = take n [[(i-n+1)..i] | i <- [1..], i `mod` n == 0]

Prelude> chunksOf 3
[[1,2,3],[4,5,6],[7,8,9]]
Prelude> chunksOf 4
[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
Prelude> chunksOf 6
[[1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18],[19,20,21,22,23,24],[25,26,27,28,29,30],[31,32,33,34,35,36]]
...