2012-01-14 21 views
5

Así que trabajo con archivos, y necesito saber la línea más grande en el archivo X. Usando Unix awk resulta en un int que estoy buscando. Pero en Haskell, ¿cómo puedo devolver ese valor y guardarlo en una variable?
he intentado definir algo con IO [Int] -> [Int]Almacenar en una variable el resultado de un shell como Int

maxline = do{system "awk ' { if (length > x) { x = length } }END{ print x }' filename";} 

no funciona causa:

Couldn't match expected type 'Int',against inferred type 'IO GHC.IO.Exception.ExitCode' 
+1

+1 para su avatar y seudónimo. :-D – missingfaktor

Respuesta

7

Esto se debe a que la acción system devuelve el estado de salida del comando que ejecuta que no se puede convertir a Int. Debe usar readProcess para obtener los comandos de salida.

> readProcess "date" [] [] 
    "Thu Feb 7 10:03:39 PST 2008\n" 

Tenga en cuenta que readProcess no pasa el comando al shell del sistema: se ejecuta directamente. El segundo parámetro es donde deberían ir los argumentos del comando. Entonces su ejemplo debe ser

readProcess "awk" [" { if (length > x) { x = length } }END{ print x }", "/home/basic/Desktop/li11112mp/textv"] "" 
+0

'* Prog> readProcess" awk "{if (length> x) {x = length}} END {print x} '/ home/basic/Desktop/li11112mp/textv" [] [] ' resultados '(exit 127): failed' – MrFabio

+0

¿Ejecutaste el comando directamente desde el shell y veras qué pasa? –

+0

Es de la carcasa – MrFabio

6

Puede utilizar readProcess para obtener una salida de otro programa. No podrá convertir el resultante IO String en un String puro; sin embargo, puede levantar funciones que esperan String s en funciones que esperan IO String s. Mis dos referencias favoritas para rebuscar con IO (y varias otras mónadas) son excelentes publicaciones de blog de sigfpe, You Could Have Invented Monads! (And Maybe You Already Have.) y The IO Monad for People who Simply Don't Care.

Para este problema en particular, recomiendo encarecidamente buscar una solución pura de Haskell (es decir, no llamar a awk). Es posible que desee readFile, lines y maximumBy.

Cuestiones relacionadas