gpt4 book ai didi

Haskell:为什么这段代码会失败?

转载 作者:行者123 更新时间:2023-12-02 14:56:08 25 4
gpt4 key购买 nike

当我尝试运行此代码时...

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”的第一行。您能解释一下原因吗?最终,我试图弄清楚如何从文件输入创建一个惰性文本列表。

最佳答案

正如 Daniel Lyons 在评论中提到的,这是由于 IO 和惰性相互作用造成的。

想象一下,如果你愿意的话:

  • withFile 打开文件,到文件句柄f
  • 返回使用 f 内容的 Thunk。
  • withFile 关闭文件。
  • 评估 Thunk。关闭的文件中没有内容。

HaskellWiki / Maintaining laziness 上提到了这个陷阱页。

要解决此问题,您可以在 withFile 中读取整个文件内容(可能通过使用 seq 强制执行)或延迟关闭文件,而不是使用 withFile .

关于Haskell:为什么这段代码会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12012907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com