如何在Haskell中检查文本文件是否为空?

Aug*_*son 0 haskell

如何在Haskell中检查文本文件是否为空?

我已经尝试过了:

main = do
       contents <- getContents
       if null contents then do
       putStrLn "File was empty"
       return()
       else do
       putStrLn "File was not empty"
       return
Run Code Online (Sandbox Code Playgroud)

hne*_*atl 6

问题实际上主要在于格式化,而不是在你的逻辑中!

空白在Haskell中很重要,请参阅此Wiki页面.遵循其规则,并在最后一个return语句中修复小错字(您需要返回单位(),就像您之前所做的那样):

main = do
   contents <- getContents
   if null contents then do
       putStrLn "File was empty"
       return ()
   else do
       putStrLn "File was not empty"
       return ()
Run Code Online (Sandbox Code Playgroud)

这应该是完美的.然而,这并不是最佳实践 - 你doif表达式的每个部分中都有块,你正在构建一个新的monadic动作,这是不必要的.鉴于无论如何putStrLn返回IO (),您可以这样做:

main = do
   contents <- getContents
   if null contents then
       putStrLn "File was empty"
   else
       putStrLn "File was not empty"
Run Code Online (Sandbox Code Playgroud)

请记住,该if ... then x else y表达式返回同一类型的值x,并y在-在这里,x并且y都具有类型IO (),所以表达式返回的IO (),这就是为什么它可以在这里面可以使用do块.


请注意,这不会检查文件是否为空,它会检查标准输入是否为空:如果您将文件中的输入传送到此程序的stdin中,这是可以的,但如果您想实际读取文件,则应该调查readFile- 你几乎不需要改变这个程序!像下面这样的东西可以解决这个问题:

main = do
   putStrLn "Enter the file path:"
   path <- getLine
   contents <- readFile path
   if null contents ...
Run Code Online (Sandbox Code Playgroud)