Haskell parse error: “peut-être incorrect indentation ou incompatibles entre parenthèses”
Je compile ce code et ghc me dit "erreur d'analyse (peut-être incorrectes indentation ou incompatibles entre parenthèses)" à la dernière ligne ("randSeq :: Integer -> String")
pair = randSeq n ++ " | " ++ randSeq n where do g <- newStdGen
let n = randomR (1,10) g
randSeq :: Integer -> String
...
J'ai fait en sorte d'utiliser l'espace pour l'indentation. J'ai évité à l'aide de la " disons un mot clé comme ci-dessous, mais il permet toujours la même erreur
pair = randSeq n ++ " | " ++ randSeq n where n = randomR (1,10) g
do g <- newSTdGen
randSeq :: Integer -> String
...
Vous devez vous connecter pour publier un commentaire.
where
est utilisé pour lier les variables à de nouvelles valeurs, comme dansEn particulier, le cas ne peut pas exécuter IO actions: tout au plus, elle peut définir par exemple
m
à une telle action. Le Haskell type de système vous oblige à spécifier une commande entre IO actions, généralement réalisé à l'aidedo
. Si Haskell a permis unewhere do g <- ...
il ne serait pas clair quand exécuter cette action, le respect pour les autres actions: par exemple,pourrait signifier
ainsi que
Retour à votre code, il vous suffit de modifier une seule
do
:Par le façon, il ya une fonction de la bibliothèque
randomRIO
qui fait la même génération de nombres, de sorte que vous pouvez simplement utiliserGardez à l'esprit que le ci-dessus génère un nombre aléatoire, et l'utilise deux fois. Si vous avez l'intention d'utiliser deux indépendants des nombres aléatoires, puis utiliser à la place
Enfin, le code ci-dessus suppose que
randSeq
renvoie uneString
et pas unIO String
. Si elle retourne unIO String
, vous avez pour ordre de ces deux actions.Ou, en utilisant une fonction de la bibliothèque pour embellir un peu le code,
ou même
Enfin,
pair
ne peut pas retourner unString
sansIO
monade, car il n'est pas une constante chaîne de caractères, mais une action qui génère une chaîne de caractères aléatoires à chaque fois qu'il est exécuté.pair
doit retourner une action et non une pure valeur. Je ne peux accepter cette réponse pour que.Vous ne pouvez pas utiliser
do
mot-clé aprèswhere
. Cela devrait vous aide à: