我正在尝试使用I / O创建一个haskell程序,该程序会提示用户输入文件名和副本名称。这是我目前的代码:
copyFile :: IO ()
copyFile = do
putStr "Enter the filename:"
name <- getLine
putStr "Enter the copy name:"
c_name <- getLine
contents <- copyFile name
但是我收到了这个错误:
The last statement in a 'do' block must be an expression
contents <- copyFile name
|
73 | contents <- copyFile name
| ^^^^^^^^^^^^^^^^^^^^^^^^^
请问我做错了什么以及如何解决?
答案 0 :(得分:1)
首先,您实际上并未使用c_name。
其次,您的问题是由最后一行引起的:contents <- copyFile name
等同于copyFile name >>= \contents ->
,它使用monadic绑定操作将copyFile name
的结果传递给另一个函数。你实际上并没有对结果做任何事情,因此它不是一个完整的表达方式。
答案 1 :(得分:1)
您定义 copyFile
函数,然后调用copyFile
函数(我假设为System.Directory
?)。所以Haskell认为你做了递归调用。因此,我们可以将函数重命名为main
。
但这并不能完全解决问题。 copyFile :: FilePath -> FilePath -> IO ()
是一个函数,需要两个FilePath
,然后将它从源复制到destionation,因此写contents <- copyFile name
是相当奇怪的,因为(1)它缺少第二个参数; (2)结果是()
,所以`内容在这里没有意义。
所以我们可以通过写:
来解决它import System.Directory(copyFile)
main :: IO ()
main = do
putStr "Enter the filename:"
name <- getLine
putStr "Enter the copy name:"
c_name <- getLine
copyFile name c_name