我是 Haskell 的初学者,我正在尝试用 Haskell 重写我的一个 shell 脚本作为测试。我想要完成的其中一件事是删除文件的最后一行并读取它的值。
我尝试使用
readFile
然后writeFile
,但我不能,因为它很懒。
我能够使用这段代码让它工作:
import Data.List
import qualified Data.ByteString.Char8 as B
import qualified Data.Text as T
import qualified Data.Text.Encoding as TL
erase filename = do
contents <- B.readFile filename
let array = map (T.unpack . TL.decodeUtf8) (B.lines contents)
B.writeFile filename $ B.pack (intercalate "\n" (init array))
print $ last array
这会将文件的行变成一个列表,然后在没有最后一行的情况下写入文件。它使用 ByteString 所以它不会偷懒。但是,我认为这种方式非常冗长并且做得很奇怪。是否有一些函数可以从文件中删除一行或者如何改进这段代码?