2012-07-17 1 views
1

Très bien, je ne suis pas sûr qu'il y ait une façon simple d'y parvenir dans Haskell, mais voici ma situation.Extraire le plus grand nombre dans le fichier texte structuré dans Haskell

que j'ai un fichier texte qui contient les éléments suivants:

map z [1,2,3,4,5,6,7] Z 
test x [1,2,3] X 
map y [1,2,3,4,5] Y 
map q [1...4] Q 

Ce que je dois faire est de trouver la plus grande valeur contenue dans la carte « liste ». Par exemple, dans l'exemple ci-dessus, le plus une carte va à 7. est Ils sont généralement formatés comme

map _ [] _ 

donc j'ai juste besoin de trouver la valeur maximale détenue par la carte dans cet exemple. Y a-t-il une façon simple de faire cela?

Merci.

+0

Eh bien, pour être franc, je suis un peu perdu sur la façon de commencer. Je commence juste à apprendre Haskell, donc mes connaissances sur le sujet ne sont pas tout à fait à la hauteur. Peut-être pourriez-vous suggérer un point de départ raisonnable qui me pousserait dans la bonne direction, et je pourrais faire un suivi à partir de là? –

+3

1) apprendre à lire le fichier. 2) Apprenez comment tokenize le fichier, en analysant les chaînes dans des listes d'entiers 3) apprenez comment trouver le maximum d'une liste d'entiers 4) apprenez comment imprimer à standard dehors. 5) Appliquer les connaissances 6)? 7) profit –

Répondre

3

Mon plan d'attaque serait quelque chose comme ceci:

  1. Asseyez-vous et d'écrire soigneusement une grammaire pour le format que je suis prêt à accepter.
  2. Créer un ADT qui peut stocker toutes (et seulement) les informations disponibles à partir d'une analyse réussie de ce format.
  3. Écrivez un analyseur Parsec. Si vous avez fait les deux étapes précédentes, cela devrait être un jeu d'enfants, mais vous devrez en apprendre un peu plus sur Parsec.
  4. Ecrivez une fonction qui traite l'ADT conçu à l'étape 2 et extrait les statistiques d'intérêt. Placer les résultats de l'étape 3 et de l'étape 4 ensemble; souvent, c'est la partie la plus fastidieuse et la moins intéressante, mais elle doit être faite. =)

Dites-nous à quelle distance de la liste vous vous trouvez avant de vous coincer, et nous pouvons vous donner des conseils plus pointus.

+0

Il a fait l'analyseur, voir http://stackoverflow.com/questions/11525788/haskell-parsec-parser-for-encountering – dflemstr

+0

@dflemstr Pour me défendre: il dit ci-dessus, "Eh bien, pour être franc, Je suis un peu perdu sur la façon de commencer. ". Si ce n'est pas vrai, il doit nous dire l'endroit où il s'est retrouvé coincé, et nous ne pouvons vraiment rien faire de mieux pour répondre à cette question jusque-là. –

+0

Je suppose qu'il a renoncé à écrire l'analyseur et s'attend à quelque chose "plus simple" comme "maximum". carte (dernière lecture. (!! 2) mots). lines', qui ne gère pas le cas '[1 ... 2]' ou '[1, 2]' bien sûr. – dflemstr

1

Si votre format de fichier est assez simple, vous pouvez écrire quelque chose comme ceci:

process :: String -> String              
process input = show . maximum $ map (maximum . readMapLine) goodLines   
     where                 
      isGood line = head (words line) == "map"       
      goodLines = filter isGood (lines input)        
      readMapLine line = read ((words line) !! 2) :: [Integer]   


main :: IO()                 
main = do                  
      input <- getContents             
      print $ process input 

J'ai omis toutes les vérifications d'erreur, et ma solution ne parvient pas à read la dernière liste dans votre fichier [1...4]: I supposons qu'il devrait simplement le jeter. Mais vous avez eu l'idée ;-)

Questions connexes