2 votes

Haskell - Lecture d'un fichier et passage de données comme arguments à une fonction

J'essaie de récupérer des données d'un fichier, de les analyser et de les transmettre à une autre fonction comme argument.

data LogLine = LogLine {
  name      :: String
, args1     :: String
, args2     :: String
, constant  :: String 
} deriving (Ord, Show, Eq)

main = do 
file <- readFile "foo"
let result = (parse final "Input" file) --Parses the file into the LogLine datatype
let firstargs = getFirstArgs result --Get the first argument out of the datatype
let secondargs = getSecondArgs result --Get the second argument out of the datatype
let constant = getConstant result --Get the constant out of the datatype
createGraph firstargs secondargs constant --THIS IS THE PROBLEM

Le problème est qu'à chaque fois que j'essaie de lire un fichier, il devient un (IO String) et je dois toujours reporter l'IO quoi que je fasse. Le site createGraph est déclarée comme

createGraph :: String -> String -> String -> Argument

mais dès que j'essaie d'exécuter la dernière instruction, il se plaint :

Couldn't match expected type `IO a0' with actual type `Argument'
In the return type of a call of `createGraph'

Je n'ai pas le droit de changer le type de retour de la fonction createGraph parce qu'elle fait partie d'une grande structure à laquelle je dois fournir les arguments. Quels sont les moyens de faire face à ce problème ?

2voto

user1105045 Points 258

Pourquoi voulez-vous faire ça ?

La seule façon de faire entrer votre valeur dans la monade IO est d'utiliser return. Vous pouvez soit envelopper l'appel à createGraph dans une autre fonction telle que

returnGraph a b c = return $ createGraph a b c

ou simplement utiliser un autre let binding et utiliser votre valeur quand vous en avez besoin. Je n'arrive pas à comprendre ce que vous voulez faire, donnez-nous plus de détails sur ce que vous voulez faire avec la valeur retournée.

-- D'après ce que j'ai compris de votre commentaire, vous avez juste besoin de retourner l'argument, donc la seule chose que vous devez faire est de retourner $ createGraph firstargs secondargs constant et de renommer la fonction main en quelque chose d'autre parce que main doit avoir le type IO ().

1voto

Code-Apprentice Points 18086

Le problème est qu'à chaque fois que j'essaie de lire un fichier, il devient un (IO String) et je dois toujours reporter l'IO quoi que je fasse.

Je ne pense pas que ce soit le vrai problème. Le problème est que main a un type de retour de IO() qui est le résultat de la dernière ligne exécutée. Dans ce cas, cela signifie que le createGraph qui aboutit à un Argument. C'est pourquoi vous obtenez l'erreur de type, qui n'a rien à voir avec la chaîne IO lue dans le fichier.

Une solution consiste à renvoyer simplement le résultat de createGraph à la fin de main :

return $ createGraph firstargs secondargs constant

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X