Haskell教程:#11 输入&输出

By George Z. August 11, 2021

输入 & 输出

到目前为止,我们讨论的所有示例本质上都是静态的。在本章中,我们将学习与用户进行动态通信。我们将学习 Haskell 中使用的不同输入和输出技术。

文件和流(File & Streams)

到目前为止,我们已经对程序本身的所有输入进行了硬编码。我们一直在从静态变量中获取输入。现在,让我们学习如何从外部文件读取和写入。让我们创建一个文件并将其命名为“abc.txt”。接下来,在此文本文件中输入以下几行:“在这里,您将获得学习 Haskell 的最佳资源。” 接下来,我们将编写以下代码,该代码将在控制台上显示此文件的内容。在这里,我们使用函数 readFile() 读取文件直到找到 EOF 字符。

main = do  
   let file = "abc.txt" 
   contents <- readFile file 
   putStrLn contents  

上面的代码将文件“abc.txt”作为字符串读取,直到遇到任何文件结束字符。这段代码将生成以下输出。

在这里,您将获得学习 Haskell 的最佳资源。

命令行参数

Haskell 还提供了通过命令提示符操作文件的工具。让我们回到终端并输入“ghci”。然后,键入以下命令集 -

let file = "abc.txt" 
writeFile file "I am just experimenting here." 
readFile file 

在这里,我们创建了一个名为“abc.txt”的文本文件。接下来,我们使用命令 writeFile 在文件中插入了一条语句。最后,我们使用命令 readFile 在控制台上打印文件的内容。我们的代码将产生以下输出 -

I am just experimenting here.

例外

异常可以被视为代码中的错误。这是编译器在运行时没有得到预期输出的情况。像任何其他优秀的编程语言一样,Haskell 提供了一种实现异常处理的方法。

如果您熟悉 Java,那么您可能知道 Try-Catch 块,我们通常会在该块中抛出错误并在 catch 块中捕获相同的错误。在 Haskell 中,我们也有相同的函数来捕获运行时错误。

try 的函数定义看起来像“try :: Exception e => IO a -> IO (Either e a)”。看看下面的示例代码。它显示了如何捕获“除以零”异常。

import Control.Exception 

main = do 
   result <- try (evaluate (5 `div` 0)) :: IO (Either SomeException Int) 
   case result of 
      Left ex   -> putStrLn $ "Caught exception: " ++ show ex 
      Right val -> putStrLn $ "The answer was: " ++ show val 

在上面的例子中,我们使用了 Control.Exception 模块的内置 try 函数,因此我们预先捕获了异常。上面的一段代码将在屏幕中产生下面的输出。

Caught exception: divide by zero 
comments powered by Disqus