Donc, je regardais la question here, et construit une solution plutôt laide pour le problème. Tout en essayant de le nettoyer, j'ai commencé à enquêter sur la compréhension de la liste et la liste de la monade. Ce que j'ai décidé de faire était de mettre en place un compteur par chiffre en utilisant la liste monad. Compte tenu d'une séquence d'entrée de chiffres, [1, 2]
, je voulais générer une séquence de sortie qui ressemblait à:mettre en œuvre un compteur par chiffre en utilisant la liste monad
[ [ 0, 0],
[ 0, 1 ],
[ 0, 2 ],
[ 1, 0 ],
[ 1, 1 ],
[ 1, 2 ] ]
C'est, j'itérer sur toutes les valeurs possibles de tous les éléments dans la liste dans cette gamme.
Le haskell.org list monad documentation dit:
La fonction liée est appliquée à toutes les valeurs possibles dans la liste d'entrée et les listes résultantes sont concaténés pour produire une liste de tous les résultats possibles.
Excellent! On dirait parfait ... Voici le code que j'ai écrit pour produire la solution:
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)
Mais appeler count
avec tout produit la liste vide, et je ne sais pas pourquoi. Qu'est-ce que je rate?
Si vous changez simplement votre cas de base en 'count [] = [[]]', ce code fonctionne. – ephemient
En fait, c'était précisément la réponse que je cherchais ... J'avais compris que mon problème était que, dans le cas de base, il n'y avait pas de solution dans la liste monad, donc il n'y avait rien à construire. La réponse de CBFraser ci-dessous a abordé cela, mais votre solution est plus proche de ce que j'avais en tête à l'origine. –