2013-04-17 5 views
1

Ce que j'essaie de faire est quand jeNested Carte en Haskell

rec1 = [("name", "obj-1"), ("status", "up"), ("region", "us")] 

alors je voudrais avoir

[("us", [("up", [("name", "obj-1"), ("status", "up"), ("region", "us")])])] 

Voici le code que je suis venu avec Haskell. Dans ma troisième ligne ci-dessus, dans ma définition de la fonction lambda, le compilateur n'est pas d'accord avec le type de val. Il dit qu'il s'attend à un char et qu'il obtient une chaîne ou ne peut pas faire correspondre la chaîne de caractères avec le type de liste. Je ne suis pas vraiment bon avec Haskell, donc si quelqu'un pouvait me donner des indications.

Merci.

EDIT: correction du type de sortie. J'ai mal tapé au début.

+0

Désolé, mais je pense que votre explication de ce que vous voulez réaliser n'est pas claire. En particulier, vous ne pouvez pas avoir quelque chose comme ["us", [("up", [("name", "obj-1"), ("status", "up"), ("région", "nous") ])]] car tous les éléments de la liste doivent être du même type. –

+0

Excuses, j'ai corrigé le type de sortie, je veux. Ce que je veux, c'est une carte de hachage imbriquée. Est-ce que le nouveau type de sortie a du sens. – Soham

+0

Bien sûr, rien de ce que vous utilisez ici est un hashmap ... –

Répondre

2

Il y a quelques problèmes avec votre code, certains faciles, et certains difficiles. Examinons d'abord les faciles:

La première est votre fonction convertto. Il existe déjà et s'appelle fromList. Il y a aussi une fonction pour créer un nouveau Map avec une paire, appelée singleton. La manière dont vous parlez des fonctions dans Data.Map est inhabituelle. La résolution de ces problèmes donne:

import qualified Data.Map as M 

rec1 = M.fromList [("name", "obj-1"), ("status", "up"), ("region", "us")] 
justfold = foldr M.singleton rec1 ["us","up"] 

Maintenant, cependant, il y a un problème plus profond. Pour savoir ce qu'il est, nous allons essayer d'ajouter des signatures de type à rec1 et justfold:

import qualified Data.Map as M 

rec1 :: M.Map [Char] [Char] 
rec1 = M.fromList [("name", "obj-1"), ("status", "up"), ("region", "us")] 

justfold :: M.Map [Char] (M.Map [Char] (M.Map [Char] [Char])) 
justfold = foldr M.singleton rec1 ["us","up"] 

rec1 est très bien, mais justfold est un problème. Pour comprendre pourquoi, regardez les signatures de type de foldr et singleton:

foldr :: (a -> b -> b) -> b -> [a] -> b 

singleton :: k -> a -> Map k a 

foldr nécessite une fonction de type (a -> b -> b) et singleton est pas, parce que a et Map k a ne sont pas la même chose. Le code suivant produit le résultat souhaité:

import qualified Data.Map as M 

rec1 = M.fromList [("name", "obj-1"), ("status", "up"), ("region", "us")] 
justfold = M.singleton "us" $ M.singleton "up" rec1 

Cependant, la question fondamentale est que vous ne pouvez pas itérer sur quelque chose qui change de type à chaque itération. Si vous vous trouvez vouloir le faire, je vous conseille de prendre du recul et de repenser votre approche du problème.

+0

J'ai obtenu ce que vous avez dit, et j'essaie de définir mon propre type de données, donc je peux réparer le lambda pour l'adapter au foldr. J'ai eu le problème, une fois que j'ai élagué le code selon les suggestions, et j'ai essayé à nouveau. Merci pour l'aide. – Soham