2010-05-15 5 views
1

J'ai des devoirs où je dois mettre à jour une liste en utilisant une fonction qui prend deux éléments et retourne une valeur d'une partie du premier élément donné dans la fonction. Il est donc nécessaire de mettre à jour l'ensemble de la liste en parcourant chaque élément et en mettant à jour sa valeur en appliquant la fonction à tous les autres éléments de la liste (y compris lui-même). Jusqu'à présent, j'ai essayé de mapper d'abord la liste (de façon à ce que chaque élément soit identique), puis de mettre à jour la valeur de chaque élément en mappant à nouveau la valeur de l'élément spécifié. valeur spécifique à travers: la fonction, l'élément spécifique et la liste entière Je reçois constamment des plaintes que je déduis de la liste de valeurs faites à partir de la «liste de fonctions p @ de la fonction map» plutôt que de simplement donner la valeur à p @ list. Voici un échantillon de ce que j'ai essayé de mettre en œuvre:Mise à jour des éléments de la liste, Haskell

res :: X -> X -> Z -- function given 

myf :: [X] -> [X] -- Here is my function 
myf ps = map newf ps 
    where 
    newf [email protected](X oldz) = X newz 
    newz = map (res p) ps 

Est-ce la bonne méthode pour essayer de mettre à jour une liste contre toute la liste elle-même?

EDIT: fautes d'orthographe et grammar- mes excuses à mettre pas aussi la balise devoirs sur elle

+0

Pourriez-vous donner des exemples de code montrant l'approche que vous décrivez? Vous pouvez également ajouter un tag de devoirs. –

+3

Votre exemple de code n'a pas beaucoup de sens - 'p' n'est pas dans la portée de' newz', 'newf' n'utilise pas ses arguments, vous n'avez pas défini' res' ou 'X' et' Z' types de données, et d'ailleurs que je ne peux même pas comprendre ce que vous essayez de faire. –

Répondre

3

Est-ce la bonne méthode pour essayer de mettre à jour une liste contre toute la liste elle-même?

Je ne suis pas sûr que le code soit correct pour n'importe quelle tâche. On dirait que vous supposez que [email protected](X oldz) prend l'élément de la liste avec le constructeur X oldz et le nomme p. Mais ...

Vous devez décrire comment se comporter lorsque votre liste est modifiée après l'application de map (res p). Si tous vos « modifications » à la liste doivent être effectuées que sur la base des valeurs initiales de la liste et être appliquées dans l'ordre du premier élément dernier:

myf ps = (buildPlan ps) ps where 
    buildPlan [] = id 
    buildPlan (x:xs) = map (res x) . buildPlan xs 

Certains peuvent préférer:

myf ps = changesPlan ps where 
    change x = map (res x) 
    changesPlan = foldr (.) id (map change ps) 

Si votre "changements" à la liste devrait prendre des changements par rapport au précédent map (res x) (en langage non fonctionnel, en parcourant la liste, vous changez tous les éléments, même ceux qui seront pris à la prochaine itération):

myf ps0 = rebuildFrom 0 ps0 where 
    rebuildFrom n ps | n >= length ps = ps 
    rebuildFrom n ps = rebuildFrom (n+1) ps' where 
     x = ps !! n 
     ps' = map (res x) ps 
Questions connexes