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
Pourquoi vous essayez de remplacer 'singlewords'? Rappelez-vous: ** Haskell n'autorise pas les variables mutables **. – AJFarmar
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
S'il vous plaît [ne pas utiliser 'nub'] (https://github.com/nh2/haskell-ordnub#dont-use-nub). – nh2