2010-11-17 12 views
1

Ce sont mes listes de haskellvaleur get de la liste tuple dans haskell

lst1 = ["a,","b","c"] 
lst2 = [("a","123"),("b","345")] 

Je veux obtenir un élément de « lst1 » et comparer avec « LST2 » et si la valeur est existe à remplacer par la deuxième valeur en tuple remplacer la 2ème valeur.

il est comme ça lst1 avait « a » et « b » si la sortie doit être [ « 123 », « 345 », « c »] alors comment puis-je faire en haskell? pls m'aider Puis-je le faire d'une autre manière ?? thankxx!

+0

Est-ce un devoir? Puis ajoutez le tag "devoirs". – Drakosha

+0

J'espère que ce n'est pas un devoir, puisque j'ai donné une réponse. En passant, vous avez probablement une faute de frappe dans lst1 (virgule supplémentaire), et dans lst2 (manquant)) –

+0

thanx qui était une erreur.hmm – 123Ex

Répondre

2

Voici comment je le ferais.

import qualified Data.Map as M 
import Data.Maybe 

lst1 = ["a","b","c"] 
lst2 = [("a","123"),("b","345")] 

-- For each value of lst1, you want to replace it by something, so you'll be using map ' 
res = map comb lst1 

-- For performance, we convert the 2nd list to a map 
m = M.fromList lst2 

-- For a value of lst1, you want to find it in the map, 
-- and return the result if found, 
-- or keep the original if not found 
comb v = fromMaybe v (M.lookup v m) 

Prelude>: r

[1 1] Compiler principales (t.hs, interprétée)

Ok, les modules chargés: Main.

* principal> res

package Chargement ... tableau-0.3.0.1 reliant ... fait.

Chargement de conteneurs-0.3.0.0 ... liaison ... terminé.

[ "123", "345", "c"]

* principal>

+0

Thanxx, Cela fonctionne très bien, ne pouvons-nous faire cette façon récursive normale? – 123Ex

+0

bien sûr que vous pouvez, il suffit de regarder la définition de la carte: http://hackage.haskell.org/packages/archive/base/4.3.0.0/doc/html/src/GHC-Base.html#map –

+2

@ 123Ex , "la voie récursive normale" n'est pas tout à fait raison. Comme les programmeurs fonctionnels sont plus expérimentés, ils utilisent généralement * less * récursion, en déléguant les parties récursives de leurs fonctions à 'map',' foldr', etc. Il y a un dicton, "la récursivité est le goto de la programmation fonctionnelle". Bien que ce ne soit pas aussi stigmatisé ... – luqui

2
map (\x -> maybe x snd $ find ((x ==).fst) lst2) lst1 

Pour les listes plus longues, vous devriez envisager d'utiliser une carte au lieu de LST2

[Modifier]

import Data.Maybe 
subst lst1 lst2 = map (\x -> fromMaybe x $ lookup x lst2) lst1 

(Merci à Chuck)

Et juste pour l'amusement inutile:

import Data.Maybe 
main = print $ subst [("a","123"),("b","345")] ["a","b","c"] 
subst = map.app fromMaybe lookup 
     where app f g x y = f y $ g y x 

L'exemple parfait pour facile d'écrire et vraiment difficile à comprendre (au moins pour moi) le code Haskell, donc je certainement utiliser l'une des autres définitions.

+0

Thnx, mais donne une erreur en disant "backslash inattendue (lamda)" – 123Ex

+0

Je l'ai essayé à nouveau dans ghci, et ça marche bien (j'ai oublié le 'import Data.List', cependant). Bien sûr, dans un vrai programme, vous avez besoin de l'appeler dans une certaine fonction avec les bons arguments, ou vous pouvez en faire une fonction elle-même, par ex. 'subst lst1 lst2 = map ...' – Landei

+0

Juste une suggestion pour la brièveté: 'peut-être x snd $ find ((x ==).fst) lst2' est précisément équivalent à 'peut-être x id $ lookup x lst2'. – Chuck