在Haskell中生成列表列表

时间:2016-06-24 19:25:15

标签: haskell set

我试图创建一个生成一组元组的函数,但我是Haskell的新手,并且不知道如何实现它。这是我喜欢我的代码所做的伪代码(我将使用{}来表示集合):

mySet :: Int -> {{(Int,Int,Int,Int,Int)}}
mySet n = { {a_1,a_2,...,a_n} | P(a_1,a_2,...,a_n) }

到目前为止我写的部分是我从中获取a_i的列表。代码是

firstList :: Int -> [(Int,Int,Int,Int,Int)]
firstList n = [(a,b,c,d,e) | a <- [0,1,(-1)], b <- [1..n], c <- [1..(2*n)], d <- [1..n], e <- [1..(2*n)]]

基本上,我希望从表格列表

中获取mySet
[(a1,a2,a3,a4,a5),(b1,b2,b3,b4,b5),...]

并创建一个列表(或实际设置),例如当n = 3时,看起来像

[[(a1,a2,a3,a4,a5),(b1,b2,b3,b4,b5),(c1,c2,c3,c4,c5)],[(d1,d2,d3,d4,d5),(e1,e2,e3,e4,e5),(f1,f2,f3,f4,f5)],...]

就实施而言,我更喜欢可读性而不是速度,但理想情况下我喜欢这两种方式。

1 个答案:

答案 0 :(得分:1)

你没有准确地告诉我们你想要怎么做,所以我们只是在推测,但是我已经定义了很多次执行非常类似的任务的函数需要一个元素列表并将其分解为子列表一定的规模:

chunkify :: Int -> [x] -> [[x]]
chunkify n [] = []
chunkify n list = chunk : chunkify n rest 
    where (chunk, rest) = splitAt n list

然后你可以从firstList n获取12个 n 4 元组并将它们分成12个 n 3 长度 n 的列表:

myLists n = chunkify n (firstList n)

或者,如果你真的想成为无点,那只是myLists = chunkify <*> firstList,因为(Int ->)是一个类似于Reader的应用程序仿函数的实例,上面的<*>是为Prelude定义的。 {1}}和/或Control.Applicative,具体取决于您正在运行的GHC版本。

如果你想要更复杂的东西,你必须让我们知道;我们不是读者。