到目前為止,我們討論的所有示例本質上都是靜態的。在本章中,我們將學習如何Haskell與用戶動態交互。學習Haskell中使用的不同輸入和輸出技術。
1. 檔和流
到目前為止,我們已經對程式本身中的所有輸入進行了硬編碼,在前面學習的內容中都是從靜態變數獲取輸入。本小節中,我們學習如何從外部檔讀取和寫入。
創建一個檔並命名為abc.txt。接下來,在此文本檔中輸入以下一行:"Welcome to zaixian. 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 zaixian
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