Estoy tratando de escribir un programa simple cat
en Haskell. Me gustaría tomar varios nombres de archivo como argumentos y escribir cada archivo secuencialmente en STDOUT, pero mi programa solo imprime un archivo y sale.¿Cómo implemento `cat` en Haskell?
¿Qué debo hacer para que mi código imprima todos los archivos, no solo el primero ingresado?
import Control.Monad as Monad
import System.Exit
import System.IO as IO
import System.Environment as Env
main :: IO()
main = do
-- Get the command line arguments
args <- Env.getArgs
-- If we have arguments, read them as files and output them
if (length args > 0) then catFileArray args
-- Otherwise, output stdin to stdout
else catHandle stdin
catFileArray :: [FilePath] -> IO()
catFileArray files = do
putStrLn $ "==> Number of files: " ++ (show $ length files)
-- run `catFile` for each file passed in
Monad.forM_ files catFile
catFile :: FilePath -> IO()
catFile f = do
putStrLn ("==> " ++ f)
handle <- openFile f ReadMode
catHandle handle
catHandle :: Handle -> IO()
catHandle h = Monad.forever $ do
eof <- IO.hIsEOF h
if eof then do
hClose h
exitWith ExitSuccess
else
hGetLine h >>= putStrLn
Me postulo el código como el siguiente:
runghc cat.hs file1 file2
Cambié la respuesta aceptada a la tuya porque corrigió mi error y también me explicó la transmisión lenta de IO. – Sam
¿Cómo se pronuncia '> =>'? – Sam
"composición kleisli". No conozco un nombre mejor (más corto) para él. – shang