【问题标题】:main: Prelude.!!: index too largemain: Prelude.!!: 索引太大
【发布时间】:2022-11-20 22:54:54
【问题描述】:

我正在尝试编写一个程序来复制文件并允许我们重命名它,就像 unix 中的 cp 命令一样。

import System.IO
import System.Environment
import qualified Data.Text as T
import qualified Data.Text.IO as TI

main :: IO ()
main = do
  args <- getArgs
  let source =  args !! 0
  let dest = args !! 1
  input <- TI.readFile source
  TI.writeFile dest input

我试过了,得到了 main: Prelude.!!: index too large

【问题讨论】:

    标签: haskell


    【解决方案1】:

    正如错误所说,这意味着索引太大,所以这意味着 getArgs 返回一个包含少于两个元素的列表。

    然而,使用 (!!) 通常不是一个好主意:不能保证该元素存在,并且它运行于?(k)获得k-th 元素。您可以使用:

    main :: IO ()
    main = do
      args <- getArgs
      case args of
        (src:dst:_) -> do
          input <- TI.readFile source
          TI.writeFile dest input
        _ -> putStrLn "You should provide a source and destination"

    加载字符串中的全部内容也不是一个好主意,因为文件可能比所有(可用)内存都大,从而导致系统崩溃。通常复制是通过两个文件处理程序完成的:一个读取源文件,一个写入目标文件,只使用少量内存。某些文件系统还可以使复制更加有效。例如,通过使用对同一文件的两个引用,并且只有在两个文件之一被修改时才有效地制作副本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      相关资源
      最近更新 更多