2017-10-09 3 views
1

J'ai récemment commencé à apprendre Haskell et j'ai rencontré un problème avec les dictionnaires. J'utilise une clé pour obtenir le nombre entier du dictionnaire, et GHCi imprime une erreur "Impossible de faire correspondre le type Char avec [Char]" sur la ligne où j'utilise un premier élément de la chaîne comme clé pour un dictionnaire. Voici le code:Impossible de trouver le type Char avec [Char], Haskell

import Data.Map 
mapRomantoInt :: Map String Int 
mapRomantoInt = fromList[("I",1),("V",5),("IX",9),("X",10),("L",50),("C",100),("D",500),("M",1000)] 

romanToInt :: String -> Int 
romanToInt _ = 0 
romanToInt c = if length c == 1 then mapRomantoInt ! head c else 
         let first = mapRomantoInt ! head c 
          second = mapRomantoInt ! (c !! 1) 
          others = romanToInt(tail c) 
         in if first < second then others - first else others + first 
+0

'head c' est un caractère. Utilisez '[head c ]' à la place. Pareil avec 'c !! 1': devrait être '[c !! 1] '. –

+1

Notez que ce style de programmation est à la fois inefficace ('longueur' scanne toute la liste), dangereux (fonctions comme 'head, tail, !!' va planter le programme quand la liste est trop courte), et incorrect (' romanToInt', comme écrit, renvoie toujours '0'). Je vous recommande fortement d'éviter ce style non-idiomatique et d'essayer d'exploiter la correspondance de motifs à la place, ce qui est plus sûr et plus idiomatique. – chi

Répondre

2

Dans Haskell, String est synonyme de [Char].

Le c dans romanToInt a le type String, à savoir [Char]. Le type de head est [a] -> a. Le type de (!) est Ord k => Map k a -> k -> a. Dans ce cas, mapRomantoInt a le type Map String Int, donc le k en question doit être String. L'appel de fonction mapRomantoInt ! head c tente cependant de transmettre un Char au lieu d'un [Char] (String).

Il y a d'autres problèmes avec le code dans l'OP, mais essayez de corriger d'abord les erreurs de compilation.

+0

Merci pour votre réponse! J'ai changé la tête c à [head c] et ça a fonctionné parfaitement! – ProPall