Compte tenu du programme ci-dessous, j'ai des problèmes liés à des monads.
***************
*** 27,30 ****
csv_raw <- slurp csv_filename
let csv_data = parseCSV csv_filename csv_raw
! printCSV csv_data -- unable to compile.
\ No newline at end of file
--- 27,35 ----
csv_raw <- slurp csv_filename
let csv_data = parseCSV csv_filename csv_raw
! case csv_data of
! Left error -> putStrLn $ show error
! Right csv_data -> putStrLn $ printCSV csv_data
!
! putStrLn "done"
!
3 Réponses :
Utilisez case code>. main = do
...
either ({- error condition function -}) printCSV csv_data
Concernant les monads:
Oui, Comment définissez-vous Une implémentation pour les listes serait De même, le débiteur pour le mais cette décalage n'est pas en sécurité: que si vous aviez un tl; dr str> em>: il n'y a pas Un code> est une monade. Donc, simplifier le problème, vous demandez essentiellement cela: p> magicmontaunwrap code>? Eh bien, vous voyez, c'est différent pour chaque monade. Chacun a besoin de son propre imprimé. Beaucoup d'entre eux ont le mot "exécuté" en eux, par exemple, runst code>, runcont code> ou runeval code>. Cependant, pour certaines monades, il pourrait ne pas être prudent de les déboucher (d'où la nécessité de différer les déboucheurs différents). P> tête code>. Mais que si la liste est vide? Un indolpeur pour peut-être code> est code> iSJust code>, mais si c'est si c'est rien code>? P> Code> monade serait quelque chose comme: p> gauche code> la valeur? (La gauche représente généralement un état d'erreur, dans votre cas, une erreur d'analyse). Donc, la meilleure façon d'agir sur une valeur code> code> Il est d'utiliser la fonction code> code> ou d'autre utiliser une instruction de cas correspondant droit code> et Laissé code>, comme l'illustre Daniel Wagner. P> magicmontaunwrap code>. Si vous êtes à l'intérieur de cette même monade, vous pouvez utiliser <- code>, mais pour extraire vraiment la valeur d'une monade ... Eh bien ... comment vous faites cela dépend de quelle monade vous traitez avec. p> p>
Il y a avec th, quelqu'un a affiché une implémentation d'un monad m => m a -> A code>. Link: blog.sigfpe.com/2009/01/Rewriting- Monadic-expressions-with.h tml
@monadic: Cette technique est intelligente, mais cela a un problème. Il vous permet seulement d'utiliser extraire code> dans une épissure de haskell, qui est interprétée alors comme une monade. Il vous donne essentiellement une fantaisie (>> =) code>, qui pourrait être attendue car extrait code> est simplement remplacé par joindre code>.
@Dan: intéressant. Je vois ton point et ça cohéronne mieux dans mon esprit quand je vois ce qui se passe.
Vous devez désapprendre ce que vous avez appris. em> p>
Maître Yoda. P>
au lieu de penser ou de rechercher des moyens de "libérer", "libérer", "libérer", "déballer" ou "extraire" des valeurs de haskell normales des contextes centrés sur effet (généralement monadiques), apprenez à utiliser un des caractéristiques plus distinctives de Haskell - Les fonctions sont valeurs de première classe em>: p>
Vous pouvez utiliser des fonctions telles que des valeurs d'autres types par exemple. Comme
bool code>,char code>,int code>,integer code> etc: p>do . . . x <- this_M y <- that_M z <- other_M let val = calculate x y z . . .
La question ne semble avoir rien à voir avec les monades. :)
@Rotsor J'allais juste poster une réponse de commentaire, mais elle a ballonné dans une réponse. La question est un peu Sorta est sur les monades, mais pas vraiment.
Paul, n'est-ce pas le problème le mauvais nom attribué
printcsv :: csv -> chaîne code>? C'est une fonction pure, pas une fonction d'un type IO. Si j'écrisputstrln $ printcsv csv_data code> pour la dernière ligne, il compile.@Applicatif: Ouais, j'ai eu un coup de pied par le mauvais nom. : - /