2011-10-06 3 views
1

Je suis un débutant à Haskell, est resté coincé sur une question simple:Haskell - Tableau

aaa :: [[(Char, Float)]] -> Float -> [[(Char, Float)]] 
aaa [[]] a = error "no indata" 
aaa [[(a,b)]] c = [[(a, b/c)]] 
aaa inD c = ?? 

Comment faire fonctionner avec plus de 1 élément de tableau?

Ex: aaa [[('a',3)],[('b',4)],[('c',5)]] 4

le résultat: [[('a',0.75)],[('b',1)],[('c',1.25)]]

Tout soupçon pls, thx!

Répondre

5

Vous pouvez définir des opérations sur les listes comme suit (je vous donne un exemple plus simple qui ajoute 1 à chaque élément de la liste)

f [] = [] 
f (head:tail) = (head + 1):(f tail) 

à savoir head:tail représente une liste; pour être plus précis, il représente le premier élément de la liste (head) et la liste restante si on enlève le premier élément (tail). Ensuite, vous appliquez généralement vos trucs à head et effectuez un appel récursif en utilisant tail.

Remplir votre exemple (sans test) cela donne:

aaa ([(a,b)]:tail) c = [(a, b/c)] : (aaa tail c)

Une chose: Vous avez affaire à une liste et que vous voulez modifier chaque élément de la liste d'une manière spécifique (mais chaque élément est transformé de la même manière). Pour de telles occasions, Haskell fournit sa fonction map intrinsèque, qui prend:

  • la fonction de transformer un des éléments de liste
  • la liste des articles

en tant que paramètres et retourne la liste transformée.

+0

Très bien, merci 4 help. Une autre question: si j'ai une entrée comme ceci: aaa [[('a', 3), ('b', 4), ('c', 5)], [('a', 3), (' b ', 4), (' c ', 5)]] 4 comment faire ce travail? – Ferry

+0

@Ferry: Vous devriez probablement ouvrir une nouvelle question pour cela. – phimuemue

+0

@Ferry: Définit une fonction qui prend '[('a', 3), ('b', 5)]' (c'est-à-dire une seule sous-liste) comme argument et le transforme. Ensuite, donnez cette fonction en argument à 'map'. – phimuemue

3

Tout d'abord, que [...] substance dénote listes, pas tableaux; il y a une différence fondamentale entre les deux. Essayez de penser en termes de fmap :: Functor a => (a -> b) -> f a -> f b. Cette fonction prend une autre fonction et l'applique sur une structure de données. Vous pouvez l'utiliser pour implémenter votre fonction. Voici une implémentation simple. Essayez de le comprendre:

aaa l c = fmap (fmap (fmap (/c))) l