Haskell:复制文件

时间:2018-02-14 13:08:16

标签: haskell io file-copying

我正在尝试使用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 
    |  ^^^^^^^^^^^^^^^^^^^^^^^^^

请问我做错了什么以及如何解决?

2 个答案:

答案 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