2012-01-05 13 views
5

Back Story: En un intento de comprender mejor a Haskell y la programación funcional, me he dado algunas asignaciones. Mi primera tarea es crear un programa que pueda examinar un conjunto de datos (un conjunto de números, palabras en un blog, etc.), buscar patrones o repeticiones, agruparlos e informarlos.Ingresando datos con Haskell

Suena bastante fácil. :)

Pregunta: Me gustaría que el programa comience creando una variable de lista a partir de los datos en un archivo de texto. Estoy familiarizado con la función readFile, pero me preguntaba si había una forma más elegante de ingresar datos.

Por ejemplo, me gustaría permitir que el usuario escriba algo como esto en la línea de comandos para cargar el programa y el conjunto de datos.

./haskellprogram textfile.txt

¿Hay una función que permitirá a esto?

Respuesta

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 

Eso debería ser suficiente para comenzar. Ahora reemplace reverse con algo más valioso :)

Hablando de analizar algunos datos de entrada, es posible que considere dividir sus datos en lines o words uso de las funciones respectivas de preludio.

+0

Muchas gracias. Aunque no pude compilar este código. ¿O es solo un pseudocódigo, como ejemplo? –

+0

@SubtleArray, me alegro de poder ayudar. ¿Podrías profundizar sobre _no fue capaz de compilar_? No es pseudocódigo. Podría compilarse después del cambio reciente. Darle una oportunidad. – Jan

+0

ghc se puso un poco gruñón en esta parte _source.hs: 10: 13: No se pudo emparejar el tipo esperado 'IO() 'con el tipo real' [Char]' _, pero todo está bien ahora. Aprecio tu tiempo y ayuda.Ahora que se ha resuelto la parte difícil, puedo comenzar con las cosas fáciles. (: D Gracias de nuevo. –

4

Está buscando la función getArgs.

+0

Este es realmente el mejor sitio de la historia. : D Gracias. –

4

matriz sutil, nunca puedo dejar de mencionar mi favorito cuando era primera aprendiendo Haskell, interact:

module Main where 
main = interact doSomething 

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

que luego usarlo como cat textfile.txt | ./haskellprogram | grep otto o lo que sea. También hay una variante en Data.Text que quizás conozcas, y algunas otras en otras bibliotecas string-ish.

1

Jugando con el relativamente nuevo ReadArgs package:

{-# LANGUAGE ScopedTypeVariables #-} 

import ReadArgs (readArgs) 

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

Probando ...

$ runhaskell args.hs blahblah 3 
blahblah 

Una irritación con readArgs es que no funciona si sólo tiene un único argumento. Hmmm...

Una vez que tenga el nombre de archivo deseado como String, puede usar readFile como de costumbre.