2017-10-04 3 views
2

J'ai récemment commencé à apprendre Haskell et je voulais convertir quelque chose en minuscules. J'ai recherché la fonction "toLower", mais cela ne semble pas fonctionner.Comment utiliser correctement toLower dans Haskell?

Prelude> import Data.Text 
Prelude Data.Text> toLower "JhELlo" 

<interactive>:2:9: error: 
    * Couldn't match expected type `Text' with actual type `[Char]' 
    * In the first argument of `toLower', namely `"JhELlo"' 
     In the expression: toLower "JhELlo" 
     In an equation for `it': it = toLower "JhELlo" 
Prelude Data.Text> toLower 'JhELlo' 

<interactive>:3:9: error: 
    * Syntax error on 'JhELlo' 
     Perhaps you intended to use TemplateHaskell or TemplateHaskellQuotes 
    * In the Template Haskell quotation 'JhELlo' 
Prelude Data.Text> 

Répondre

4

Il ne fonctionne pas, parce que la version que vous avez essayé d'utiliser fonctionne sur Text, et non String. Ce sont deux types distincts. Vous avez deux options à ce stade:

1) Utiliser toLower de Data.Char; celui-ci fonctionne sur un seul caractère, et vous pouvez mapper sur votre chaîne:

map toLower "JhELlo" 

2) vous convertir chaîne à Data.Text (et éventuellement à nouveau):

unpack . toLower . pack $ "JhELlo" 

Il y a en fait other versions of toLower autour ; celui de Data.Sequences semble être polymorphe (il devrait donc fonctionner sur les deux), mais il peut être nécessaire d'insérer le paquet mono-traversable en tant que dépendance.

+2

Et si vous avez le choix, 'Data.Text.toLower' devrait être préféré à' Data.Char.toLower', car son comportement est plus correct sur les textes internationaux. Par exemple, 'Data.Text.toLower" İ "=" i \ 775 "' (deux points de code de sortie!) Alors que 'Data.Char.toLower" İ "=" i "' est juste une approximation. –