2015-12-23 1 views
3

J'essaie de supprimer les doublons d'un fichier texte et j'ai essayé un code comme suit;supprimer les doublons dans un fichier texte dans haskell

import Data.List 
main = do 
    let singlewords = [] 
    handle <- readFile "/tmp/foo.txt" 
    singlewords = words handle 
    nub singlewords 

Il donne une erreur bien sûr depuis que je suis très nouveau pour HASKELL et je l'ai fait quelques exercices mais je pense avoir plus de temps pour s'y habituer. Je serais vraiment très apprécié pour votre aide.

+1

Pourquoi vous essayez de remplacer 'singlewords'? Rappelez-vous: ** Haskell n'autorise pas les variables mutables **. – AJFarmar

+0

Ce n'était pas ma tention. Quand j'ai écrit comme ça, la portée des variables est comme en Java ou C++, comme déclarer un int et l'initialiser dans une boucle par exemple. Mais apparemment ce n'est pas le cas avec Haskell. – user3104760

+0

S'il vous plaît [ne pas utiliser 'nub'] (https://github.com/nh2/haskell-ordnub#dont-use-nub). – nh2

Répondre

6

Votre code fixe:

import Data.List 

main = do 
    -- let singlewords = [] -- this line removed 
    content <- readFile "/tmp/foo.txt" 
    let singlewords = words content -- added the let keyword 
    return (nub singlewords) -- added call to return 

Sur la première ligne que vous écrivez let singlewords = [] puis essayez ensuite d'affecter une nouvelle valeur à singlewords. Ce n'est pas comme cela que nous le faisons dans Haskell, il n'est pas nécessaire de "déclarer" ou de "définir" les noms avant de les utiliser.

Dans Haskell, nous séparons les calculs effectifs (IO est un type de calculs efficaces) à partir de calculs purs. Nous relions les résultats des calculs effectful utilisant

name <- computation 

et on lie les résultats de calculs purs utilisant

let name = computation 

quand dans un do -bloc.

La dernière ligne d'un bloc do est ce que le bloc entier va calculer, et doit donc être un calcul efficace. Dans votre exemple, vous voulez retourner le résultat d'un calcul pur et devez donc soulever le résultat à un effet, nous le faisons en utilisant return.


Pour voir vos mots simples que vous voulez les à la console, il y a quelques fonctions de le faire: https://hackage.haskell.org/package/base-4.8.1.0/docs/Prelude.html#g:27.

Le plus simple serait de sortie la liste singlewords utilisant print:

main = do 
    content <- readFile "/tmp/foo.txt" 
    let singlewords = nub (words content) 
    print singlewords 
+0

C'était très éclair pour moi, merci beaucoup. Mais puis-je demander comment puis-je voir la sortie pour cela à partir de la ligne de commande? Comment vais-je voir tous les mots sans doublons? – user3104760

+1

@ user3104760: mise à jour de la réponse! – adamse

+0

Oh bien sûr! Impressionnant! Permettez-moi de demander une dernière chose. Pensez-vous que le nœud ici fonctionne correctement? Est-ce que ma mise en œuvre fait la bonne chose? Quels sont vos commentaires? Je serais très heureux d'entendre. Je vous remercie! – user3104760