【发布时间】:2012-08-17 20:42:53
【问题描述】:
当我尝试运行此代码时...
module Main where
import qualified Data.Text.Lazy.IO as LTIO
import qualified Data.Text.Lazy as LT
import System.IO (IOMode(..), withFile)
getFirstLine :: FilePath -> IO String
getFirstLine path =
withFile path ReadMode (\f -> do
contents <- LTIO.hGetContents f
return ("-- "++(LT.unpack . head $ LT.lines contents)++" --"))
main::IO()
main = do
firstLine <- getFirstLine "/tmp/foo.csv"
print firstLine
我明白了
"-- *** Exception: Prelude.head: empty list
... 我希望它打印“/tmp/foo.csv”的第一行。你能解释一下为什么吗?最终,我试图弄清楚如何从文件输入中创建一个惰性文本列表。
【问题讨论】:
-
/tmp/foo.csv 里面有什么吗?
-
我猜这是因为在评估读取内容的 thunk 时,文件已经关闭。
-
是的,该文件确实包含一些内容。为什么 thunk 读取内容时会关闭文件?
标签: haskell file-io monads lazy-evaluation