Итак, я смотрел на вопрос здесь и выстроил довольно уродливое решение проблемы. Пытаясь очистить его, я начал исследовать списки и списочную монаду. Я решил внедрить счетчик на одну цифру, используя монаду списка. Учитывая входную последовательность цифр, [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
с чем-либо получается пустой список, и я не знаю почему. Чего мне не хватает?