2012-01-05 20 views
5

Indietro Storia: Nel tentativo di comprendere meglio Haskell e la programmazione funzionale, mi sono dato alcuni compiti. Il mio primo compito è quello di creare un programma che può guardare attraverso un set di dati (un insieme di numeri, parole in un blog, ecc.), Cercare modelli o ripetizioni, raggrupparli e segnalarli.Inserimento dati con Haskell

Suoni abbastanza facili. :)

Domanda: Mi piacerebbe che il programma inizi creando una variabile di elenco dai dati in un file di testo. Conosco la funzione readFile, ma mi chiedevo se esistesse un modo più elegante per inserire i dati.

Ad esempio, vorrei consentire all'utente di digitare qualcosa di simile nella riga di comando per caricare il programma e il set di dati.

./haskellprogram textfile.txt

C'è una funzione che permetterà questo?

risposta

12
import System.Environment 

main :: IO() 
main = do 
    args <- getArgs 
    -- args is a list of arguments 
    if null args 
    then putStrLn "usage: ./haskellprogram textfile.txt" 
    else do contents <- readFile $ head args 
      putStrLn $ doSomething contents 

doSomething :: String -> String 
doSomething = reverse 

Questo dovrebbe essere sufficiente per iniziare. Ora sostituisci reverse con qualcosa di più prezioso :)

Parlando di analizzare alcuni dati di input, potresti prendere in considerazione la possibilità di suddividere i tuoi dati in lines o words utilizzando le rispettive funzioni di Prelude.

+0

Grazie mille. Non ero in grado di compilare questo codice però. O è solo uno pseudocodice, ad esempio? –

+0

@SubtleArray, sono felice di poterti aiutare. Potresti approfondire _ non è stato in grado di compilare? Non è pseudocodice. Potrebbe essere compilato dopo il recente cambiamento. Provaci. – Jan

+0

ghc è diventato un po 'scontroso con questa parte _source.hs: 10: 13: non poteva corrispondere al tipo atteso 'IO()' con il tipo effettivo' [Char] '_, ma tutto va bene ora. Apprezzo il tuo tempo e il tuo aiuto.Ora che la parte difficile è stata risolta, posso iniziare con le cose facili. (: D Grazie ancora. –

4

Stai cercando la funzione getArgs.

+0

Questo è davvero il miglior sito di sempre. : D Grazie. –

4

Array Sottile, non riesco mai a resistere a menzionare il mio preferito quando stavo imparando prima Haskell, interact:

module Main where 
main = interact doSomething 

doSomething :: String -> String 
doSomething xs = reverse xs 

poi lo usano come cat textfile.txt | ./haskellprogram | grep otto o qualsiasi altra cosa. C'è anche una variante in Data.Text che potresti conoscere e altre in altre librerie string-ish.

1

Giocando con il relativamente nuovo ReadArgs package:

{-# LANGUAGE ScopedTypeVariables #-} 

import ReadArgs (readArgs) 

main = do 
    (fname :: String, foo :: Int) <- readArgs 
    putStrLn fname 

Testing ...

$ runhaskell args.hs blahblah 3 
blahblah 

Un'irritazione con readArgs è che non funziona se hai solo un singolo argomento. Hmmm...

Una volta ottenuto il nome file desiderato come String, è possibile utilizzare readFile come al solito.

Problemi correlati