Tôi đang cố viết một chương trình đơn giản cat
trong Haskell. Tôi muốn lấy nhiều tên tập tin làm đối số và viết từng tệp theo thứ tự STDOUT, nhưng chương trình của tôi chỉ in một tệp và thoát.Làm cách nào để triển khai `cat` trong Haskell?
Tôi cần làm gì để làm cho mã của mình in mọi tệp, chứ không phải mã đầu tiên được truyền vào?
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
Tôi đang chạy các mã như thế này:
runghc cat.hs file1 file2
Tôi đã chuyển câu trả lời được chấp nhận cho bạn bởi vì bạn đã sửa lỗi của mình và cũng giải thích luồng IO lười biếng. – Sam
Làm thế nào để bạn phát âm '> =>'? – Sam
"thành phần kleisli". Tôi không biết bất kỳ tên nào ngắn hơn (ngắn hơn) cho nó. – shang