如何在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)
问题实际上主要在于格式化,而不是在你的逻辑中!
空白在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)
这应该是完美的.然而,这并不是最佳实践 - 你do在if表达式的每个部分中都有块,你正在构建一个新的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)
| 归档时间: |
|
| 查看次数: |
622 次 |
| 最近记录: |