Haskell输入和输出
到目前为止,我们讨论的所有示例本质上都是静态的。在本章中,我们将学习如何Haskell与用户动态交互。学习Haskell中使用的不同输入和输出技术。
1. 文件和流
到目前为止,我们已经对程序本身中的所有输入进行了硬编码,在前面学习的内容中都是从静态变量获取输入。本小节中,我们学习如何从外部文件读取和写入。
创建一个文件并命名为abc.txt。接下来,在此文本文件中输入以下一行:"Welcome to Yiibai. Here, you will get the best resource to learn Haskell."
接下来,我们将编写以下代码,这些代码将在控制台上显示abc.txt文件的内容。使用函数readFile()
来读取文件直到找到EOF
字符为止。
main = do
let file = "abc.txt"
contents <- readFile file
putStrLn contents
上面的代码将读取文件abc.txt中的内容作为字符串,直到遇到任何文件结尾字符。这段代码将生成以下输出:
Welcome to Yiibai
Here, you will get the best resource to learn Haskell.
观察到在终端上打印的内容与文件中内容是一致的。
2. 命令行参数
Haskell还提供了通过命令提示符来操作文件的功能。进入终端并输入ghci
。然后,键入以下命令集 -
let file = "abc.txt"
writeFile file "I am just experimenting here."
readFile file
在这里,我们创建了一个名为abc.txt的文本文件。接下来,使用命令writeFile
向文件中插入了一行内容。最后使用readFile
命令在控制台上打印文件的内容。执行代码后产生以下输出:
I am just experimenting here.
3. 异常
可以将异常视为代码中的错误。在这种情况下,编译器在运行时无法获得预期的输出。与其他好的编程语言一样,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