Haskell 哈斯克尔';s hGetContents是';即使我知道文件包含文本,也不会返回任何内容

Haskell 哈斯克尔';s hGetContents是';即使我知道文件包含文本,也不会返回任何内容,haskell,lazy-evaluation,Haskell,Lazy Evaluation,我有一小段代码也没有达到我的预期: tempTest = do (_,tHand) <- openTempFile "." "tempTest.txt" hPutStr tHand "Test!" read <- hGetContents tHand putStrLn read tentest=do (u,tHand)这里的问题是文件的句柄指向文件的末尾。这应该起作用: tempTest = do (_,tHand) <- openTe

我有一小段代码也没有达到我的预期:

tempTest = do
    (_,tHand) <- openTempFile "." "tempTest.txt"
    hPutStr tHand "Test!"
    read <- hGetContents tHand
    putStrLn read
tentest=do

(u,tHand)这里的问题是文件的句柄指向文件的末尾。这应该起作用:

tempTest = do
    (_,tHand) <- openTempFile "." "tempTest.txt"
    hPutStr tHand "Test!"
    hSeek tHand AbsoluteSeek 0 -- move the file handle to beginning of file
    read <- hGetContents tHand
    putStrLn read

这里使用
hSeek
功能,将
句柄移动到文件的开头。另外,我建议您在完成工作后使用
hClose
函数关闭文件句柄。

这里的问题是文件句柄指向文件的末尾。这应该起作用:

tempTest = do
    (_,tHand) <- openTempFile "." "tempTest.txt"
    hPutStr tHand "Test!"
    hSeek tHand AbsoluteSeek 0 -- move the file handle to beginning of file
    read <- hGetContents tHand
    putStrLn read

这里使用
hSeek
功能,将
句柄移动到文件的开头。另外,我建议您在完成工作后使用
hClose
函数关闭文件句柄。

Wow。现在我想起来了,句柄应该在文件的末尾,只是写了一些东西-u-。非常感谢。有史以来最快的答案。@Sibi我有点担心,如果你把
hClose
和像
hGetContents
这样的懒惰IO结合起来,它会很容易做错事。@rjanJohansen会出什么错?它有机会提前删减文本吗?@Carcigenicate看看什么时候懒惰的IO会成为问题。@Carcigenicate是的,就是这样。哇。现在我想起来了,句柄应该在文件的末尾,只是写了一些东西-u-。非常感谢。有史以来最快的答案。@Sibi我有点担心,如果你把
hClose
和像
hGetContents
这样的懒惰IO结合起来,它会很容易做错事。@rjanJohansen会出什么错?它有机会提前剪切文本吗?@Carcigenicate仔细观察,了解什么时候懒惰IO会成为一个问题。@Carcigenicate是的,就是这样。请注意,由于懒惰,Haskell的标准IO例程经常会出现类似的问题。在这种情况下,这是完全没有问题的,但通常情况下,采用完全严格的IO是一个好主意,即打开并读取整个文件,然后立即关闭它:所需的时间和内存通常是可以忽略的(尽管有时当然不是!),而且您会变得更简单,可靠的语义。我还没有故意在Haskell中使用任何严格的东西。我所知道的确保严格性的唯一方法是$!运算符,据我所知,它会导致在应用程序期间调用
seq
(因此我想我也知道
seq
)。不过,我还没有使用这两种方法。请注意,由于懒惰,Haskell的标准IO例程经常会出现类似的问题。在这种情况下,这是完全没有问题的,但通常情况下,采用完全严格的IO是一个好主意,即打开并读取整个文件,然后立即关闭它:所需的时间和内存通常是可以忽略的(尽管有时当然不是!),而且您会变得更简单,可靠的语义。我还没有故意在Haskell中使用任何严格的东西。我所知道的确保严格性的唯一方法是$!运算符,据我所知,它会导致在应用程序期间调用
seq
(因此我想我也知道
seq
)。但我还没有使用这两种方法。