Travailler sur une liste de listes en Haskell
Je suis un peu débutant à Haskell donc, je me bats un peu avec le type strict des trucs, je me demandais si quelqu'un peut m'aider avec une fonction je suis en train de construire. Fondamentalement, il faut une liste de listes, par exemple:
[[1,2,3], [7,6,8], [0,3,4]]
et les ajoute dans une liste de la traduction de la plus tard de la liste par le nombre de postes, il est long. Ainsi, travailler sur la liste d'exemples, il serait effectivement faire quelque chose comme:
foldl (zipWith +) [] [[1,2,3],[0,7,6,8],[0,0,0,3,4]]
Voici ma fonction actuelle (qui est le type d'erreurs):
addLists :: [[Integer]] -> [Integer]
addLists [[]] = []
addLists [[x]] = [x]
addLists [x:xs] = zipWith (+) [x] ([0]++ (addLists xs))
Veuillez préciser ce que vous souhaitez que le résultat de
Il semble que vous avez édité votre question de le préciser, mais je crains que je ne comprends toujours pas. Quel doit être le résultat de
Voulez-vous le résultat à
Oups, signifiait
Désolé, la sortie doit être
addLists [[1,2,3], [7,6,8], [0,3,4]]
. Il n'est pas évident de votre question.Il semble que vous avez édité votre question de le préciser, mais je crains que je ne comprends toujours pas. Quel doit être le résultat de
addLists [[1,2,3], [7,6,8], [0,3,4]]
ressembler? L'exemple que vous avez donné, foldl (zipWith +) [] [[1,2,3],[0,7,6,8],[0,0,0,3,4]]
n'est pas de type vérifier, et je ne peux pas comprendre ce que vous aviez l'intention de faire.Voulez-vous le résultat à
[1, 2+7, 3+6+0, 8+4, 4]
= [1,9,9,12,4]
?Oups, signifiait
[1,9,9,11,4]
?Désolé, la sortie doit être
[1, 2+7, 3+6+0, 8+3, 4]
OriginalL'auteur Nathan Edwards | 2012-10-31
Vous devez vous connecter pour publier un commentaire.
Je pense que cela ne ce que vous voulez
Désolé, je voulais dire de revenir et de développer cette réponse, mais somethign d'autre est venu. Aurez très bientôt, j'espère!
Un peu plus agréable:
addLists = map sum . transpose . zipWith (++) (inits (repeat 0))
. La partie intéressante esttranspose
, qui est unData.List
fonction digne d'être familier avec. Puisque c'est une composition, vous pouvez jouer avec chaque partie individuellement pour comprendre comment il fonctionne.Merci beaucoup. J'ai travaillé sur la façon dont il fonctionne maintenant 🙂
OriginalL'auteur Chris Taylor
Noter que
([0]++)
est le même que(0:)
, qui va donner un aspect plus propre et nous sauver d'une nanoseconde ou deux.(Je plaisante avec l'ordre de la nanoseconde chose - aucun humain ne peut dire quand quelque chose est une nanoseconde plus rapide, mais il est plus agréable de cette façon de toute façon.)
Nous allons d'abord penser à faire les listes dont vous avez besoin. Nous voulons
Qui est assez d'informations pour une définition:
Maintenant, vous avez dit
mais vous voulez dire que
mais malheureusement, qui vous donne
[]
parce quezipWith
s'arrête dès que l'une des listes d'exécuter à partir d'éléments.Nous avons besoin de les compresser qui ne s'arrête pas.
Solution 1: trouver le plus long, faire tout ce qui
maxlength
à l'aide detake maxlength.(++ repeat 0)
Solution 2: écrire une autre zipWith fonction qui ne s'arrête pas.
Je préfère la solution 2. Regardons les définition de
zipWith
OK, il ne faut pas s'arrêter alors:
Maintenant, vous pouvez remplacer
zipWith (+)
aveczipWithMore (+)
. Je vais laisser le mot de la fin pour vous.(0:)
ne vous gagner des nanosecondes sur([0]++)
, du moins pas avecghc -O2
.(:)
parfois est de plus agréable que de(++)
où est applicable, mais vous ne devriez pas laisser l'ordre de la nanoseconde à la spéculation comme celle de la forme de votre code.Bien sûr que non! J'ai été en indiquant par la blague en disant "sauvez un ordre de la nanoseconde ou deux" qu'il est inutile.
(0:)
est plus agréable si, et j'ai voulu introduire cette habitude. Qui se soucie de nanosecondes avec un problème comme celui-ci? J'ai fait plus clair, il n'était pas destiné au sérieux.OriginalL'auteur AndrewC