Une façon est d'établir les cas limitativement:
charFromEscape :: Char -> Char
charFromEscape 'n' = '\n'
charFromEscape 't' = '\t'
--- ... --- Help!
Vous pouvez également utiliser lookup
:
-- this import goes at the top of your source file
import Data.Maybe (fromJust)
charFromEscape :: Char -> Char
charFromEscape c = fromJust $ lookup c escapes
where escapes = [('n', '\n'), ('t', '\t')] -- and so on
Le bit fromJust
peut paraître étrange. Le type de lookup
est
lookup :: (Eq a) => a -> [(a, b)] -> Maybe b
ce qui signifie que pour une valeur d'un certain type sur lequel l'égalité est définie et une table de consultation, il veut vous donner la valeur correspondante de la table de recherche, mais la clé n'est pas garanti être présent dans la table! Tel est l'objet de Maybe
, dont la définition est
data Maybe a = Just a | Nothing
Avec fromJust
, il suppose obtenu Just something
(-à-dire, c
a une entrée dans escapes
), mais cela se désagréger lorsque cette hypothèse est invalide:
ghci> charFromEscape 'r'
*** Exception: Maybe.fromJust: Nothing
Ces exemples vous déplacer le long de l'exercice, mais il est clair que vous souhaitez une meilleure gestion des erreurs. En outre, si vous vous attendez à ce que la table de recherche soit grande, vous pouvez rechercher Data.Map.
Il est dommage que 'lexEscChar' ne soit pas exporté sinon cela aurait été la réponse parfaite. Merci de m'avoir mis au courant. – dukedave