それで、私はここで質問を見て、問題のかなり醜い解決策を構築しました。それをきれいにしようとしている間、私はリスト内包表記とリストモナドを調査し始めました。私がやろうと思ったのは、リストモナドを使用して桁ごとのカウンターを実装することでした。数字の入力シーケンスが与えられた場合、[1, 2]
次のような出力シーケンスを生成したいと思いました。
[ [ 0, 0],
[ 0, 1 ],
[ 0, 2 ],
[ 1, 0 ],
[ 1, 1 ],
[ 1, 2 ] ]
つまり、その範囲内のリスト内のすべての要素のすべての可能な値を反復処理します。
haskell.orgリストのモナドドキュメントには次のように書かれています。
バインドされた関数は、入力リスト内のすべての可能な値に適用され、結果のリストが連結されて、すべての可能な結果のリストが生成されます。
素晴らしい!完璧に見えます...ソリューションを作成するために私が書いたコードは次のとおりです。
count :: [Integer] -> [[Integer]]
count [] = []
count (x:xs) =
-- get all possible sequences for the remaining digits
let
remDigits :: [[Integer]]
remDigits = count xs
in
-- pull out a possible sequence for the remaining digits
do nextDigits <- remDigits
-- pull out all possible values for the current digit
y <- [0..x]
-- record that "current digit" : "remaining digits" is
-- a valid output.
return (y:nextDigits)
しかし、何かを使って呼び出すcount
と空のリストが生成され、その理由はわかりません。私は何が欠けていますか?