これが宿題だと仮定して、私はあなたに答えの一部を与え、この種の問題を通して私がどのように考えるかを示します. GHCi で実験して、必要な部分を構築することは役に立ちます。必要なことの 1 つは、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]]
(ここでは、たとえば 1 の代わりに 99 を使用しました。これは、数字がどこから来たのかを簡単に確認できるようにするためです。) したがって、それを行う関数を作成できます。
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 に拡張できることを願っています。