假设这是作业,我会给你答案的一部分,并告诉你我是如何思考这个问题的。在 GHCi 中进行实验并构建我们需要的部分很有帮助。我们需要的一件事是能够生成从 1 到 的数字列表y
。假设y
是 7。那么:
λ> [1..7]
[1,2,3,4,5,6,7]
但是正如您稍后会看到的,我们真正需要的不是一个简单的列表,而是一个我们可以在其上构建的列表。像这样:
λ> map (:[]) [1..7]
[[1],[2],[3],[4],[5],[6],[7]]
这基本上是说获取数组中的每个元素,并将其添加到空列表中[]
。所以现在我们可以编写一个函数来为我们做这件事。
makeListOfLists y = map (:[]) [1..y]
接下来,我们需要一种方法来为列表列表中的每个元素添加一个新元素。像这样的东西:
λ> map (99:) [[1],[2],[3],[4],[5],[6],[7]]
[[99,1],[99,2],[99,3],[99,4],[99,5],[99,6],[99,7]]
(我在这里用了 99 而不是 1,这样你就可以很容易地看到这些数字是从哪里来的。)所以我们可以编写一个函数来做到这一点:
prepend x yss = map (x:) yss
最终,我们希望能够获取一个列表和一个列表列表,并prepend
在列表中的每个元素上调用列表列表中的每个元素。map
我们可以再次使用该函数来做到这一点。但事实证明,如果我们将参数的顺序切换为 ,这样做会更容易一些prepend
,如下所示:
prepend2 yss x = map (x:) yss
然后我们可以这样做:
λ> map (prepend2 [[1],[2],[3],[4],[5],[6],[7]]) [97,98,99]
[[[97,1],[97,2],[97,3],[97,4],[97,5],[97,6],[97,7]],[[98,1],[98,2],[98,3],[98,4],[98,5],[98,6],[98,7]],[[99,1],[99,2],[99,3],[99,4],[99,5],[99,6],[99,7]]]
所以现在我们可以编写该函数:
supermap xs yss = map (prepend2 yss) xs
使用您的示例,如果 x=2 和 y=3,那么我们需要的答案是:
λ> let yss = makeListOfLists 3
λ> supermap [1..3] yss
[[[1,1],[1,2],[1,3]],[[2,1],[2,2],[2,3]],[[3,1],[3,2],[3,3]]]
(如果这就是我们所需要的,我们可以使用列表推导更轻松地做到这一点。但由于我们需要能够对任意 x 执行此操作,列表推导将不起作用。)
希望您可以从这里获取它,并将其扩展到任意 x。