0
votes

Comment réparer '' impossible de faire correspondre le type attendu IO A0 avec INT '' in Haskell?

La ligne checkargcount args me donne le problème. args est un type [string] n'est-ce pas? Je suis confus pourquoi cela me donne une erreur. XXX


3 commentaires

Notez que lorsqu'il y a deux arguments, votre code simplifie DO args <- getargs; 2 où le 2 est le résultat de checkargcount args . Mais 2 n'a pas de sens à l'intérieur du faire , car ce n'est pas une action à effectuer. En effet, c'est la question. À mon avis, checkargcount a le mauvais type: pourquoi devrait vérifier quelque chose de retourner un int?


retour $ $ checkargcount args , mais en code réel, checkargcount args ne sera pas la dernière chose que vous appelez, alors vous voulez probablement faire autre chose avec la valeur de retour de checkargcount .


La notation peut être confondre lorsque vous commencez, au cas où vous ne le saviez pas déjà, le wiki a un bon page dessus.


3 Réponses :


4
votes

principal est déclaré avoir le type io () (ce qui est correct). La dernière expression dans n'importe quelle fonction est la valeur de retour. Ce code particulier renvoie le résultat de checkargcount args , qui est int .

Un int La valeur n'est pas une valeur io () , de sorte que cela ne tape pas la vérification.

Vous devez soit modifier le type de checkargcount pour renvoyer () ou io () ou ajoutez plus de code à principal qui utilise le int renvoyé par checkargcount .


0 commentaires

4
votes

oui, args :: [string] , mais checkargcount args doit avoir type io () , étant la dernière ligne du < Code> DO Block avec le type global io () .

Donc, il s'agit du type de sortie, pas du type d'entrée de cette fonction.

Changer 2 à Imprimer 2 dans le si est conséquent "de manière à résoudre ce problème (et bien sûr changer la signature de type de CheckARGCount pour adapter le changement).


0 commentaires

1
votes
args <- getArgs
     if (length args) /= 2
        then return()
        else do -- ..continue coding
Proved to be far simpler solution

1 commentaires

Pensez à utiliser system.exit.die ou quelque chose de similaire au lieu de retour () .