Haskell lecture du fichier
J'ai récemment commencé à apprendre Haskell et je vais avoir beaucoup de mal à essayer de comprendre comment la lecture du fichier d'œuvres.
Par exemple, j'ai un fichier texte "test.txt"
Et il contient des lignes de chiffres, par exemple:
32 4
2 30
300 5
Je veux lire chaque ligne, puis de l'évaluation de chaque mot et de les ajouter.
Donc je suis en train de faire quelque chose comme cela pour l'instant:
import System.IO
import Control.Monad
main = do
let list = []
handle <- openFile "test.txt" ReadMode
contents <- hGetContents handle
singlewords <- (words contents)
list <- f singlewords
print list
hClose handle
f :: [String] -> [Int]
f = map read
Je sais que c'est complètement faux, mais je ne sais pas comment utiliser la syntaxe exacte.
Toute aide sera grandement appréciée.
Ainsi que des liens vers de bons tutoriels qui ont des exemples et explication du code, sauf celui-ci:
http://learnyouahaskell.com/input-and-output Je l'ai lu entièrement
Vous devez vous connecter pour publier un commentaire.
Pas un mauvais départ! La seule chose à retenir est que pure fonction de l'application doit utiliser
let
au lieu de la liaison<-
.C'est le minimum de changement nécessaire pour obtenir la chose pour compiler et exécuter. Stylistiquement, j'ai quelques commentaires:
list
deux fois l'air un peu louche. Notez que ce n'est pas la mutation de la valeurlist
-- c'est à la place de l'ombre à la définition de l'ancienne.readFile
est préférable de l'ouvrir manuellement, la lecture et la fermeture d'un fichier.La mise en œuvre de ces changements donne quelque chose comme ceci:
Daniel Wagner solution est un grand. Voici un autre swing à elle de sorte que vous pouvez obtenir quelques idées sur l'efficacité de traitement des fichiers.
D'abord, vous pourrez voir le OverloadedStrings pragma. Cela permet d'utiliser des guillemets pour les littéraux de chaîne qui sont en fait des bytestrings. Nous allons utiliser Paresseux ByteStrings pour le traitement du fichier pour plusieurs raisons. Tout d'abord, il nous permet de diffuser le fichier par le biais du programme plutôt que de forcer tous en mémoire à la fois. Aussi, bytestrings sont plus rapides et plus efficaces que les cordes en général.
Tout le reste est à peu près simple. Nous readFile le fichier dans un paresseux liste de lignes, et puis la carte un résumé de la fonction sur chacune des lignes. Le
<$>
sont juste des raccourcis pour nous permettre de fonctionner sur la valeur à l'intérieur de IO() foncteur-si c'en est trop, je m'en excuse. Je veux seulement dire que lorsque vous readFile vous n'obtenez pas de retour à une ByteString, vous obtenez en retour un ByteString enveloppé dans un IO IO(ByteString). Le<$>
dit "Hey' je veux faire fonctionner sur la chose à l'intérieur de l'OI, puis les envelopper vers le haut.B. split sépare chaque ligne en chiffres basés sur les espaces. (On peut aussi utiliser B. les mots pour cela), La seule autre partie intéressante est le
sumStrs
nous utilisons la déconstruction/pattern matching pour extraire la première valeur de la Juste qui est retourné par la readInt fonction.J'espère que cela vous a été utile. Demander si vous avez des questions.
Pour tous les non-fonctionnelle programmeurs là c'est un plaisir
Lit un fichier dans une chaîne
Pas d'IO String, juste une normale complètement chargées de la chaîne de prêt à l'emploi.
Cela pourrait ne pas être la bonne façon, mais il fonctionne et pas besoin de changer vos fonctions existantes pour les adapter IO String
p.s.
N'oubliez pas d'importer
IO String
" il n'y a pas besoin de toute façon. Toute pure fonction doit être conservé pur, peu importe, et si vous l'utilisez avecIO
alors vous venez de soulever dans cette monade avecfmap
(ou de faire bloc avecx <- someIOAction
).unsafe
ne devrait pas sonner les cloches 🙂 C'est une mauvaise idée. Dans GHCi vous pouvez utilisers <- readFile "file.txt"
pour obtenir le contenu ens
, pas besoin deunsafe*
fonctions.unsafePerformIO
. Je travaille avec Haskell pour plus d'une décennie et n'ont jamais vu une utilisation deunsafePerformIO
dans un ordiary (c'est à dire pas de système de niveau) du programme. Les débutants doivent d'abord maîtriser le cœur de Haskell avant de s'aventurer àunsafe
.