另一個 Haskell 教程/入門
| Haskell | |
|---|---|
| |
| 另一個 Haskell 教程 | |
| 前言 | |
| 簡介 | |
| 入門 | |
| 語言基礎 (解答) | |
| 型別基礎 (解答) | |
| IO (解答) | |
| 模組 (解答) | |
| 高階語言 (解答) | |
| 高階型別 (解答) | |
| 單子 (解答) | |
| 高階 IO | |
| 遞迴 | |
| 複雜度 | |
有三個著名的 Haskell 系統:Hugs,GHC 和 NHC。Hugs 專門是一個直譯器,這意味著您不能用它編譯獨立程式,但可以在互動式環境中測試和除錯程式。GHC 既是直譯器(像 Hugs 一樣),也是編譯器,它將生成獨立程式。NHC 專門是一個編譯器。您使用哪個完全取決於您。我嘗試在以下列表中列出一些差異,但這當然遠非詳盡無遺
- Hugs - 載入檔案速度非常快,執行速度很慢;實現了幾乎所有 Haskell 98(標準)和大多數擴充套件;內建模組瀏覽支援;無法建立獨立程式;用 C 編寫;幾乎可以在所有平臺上執行;內建圖形庫。
- GHC - 互動式環境比 Hugs 載入速度慢,但允許在環境中定義函式(在 Hugs 中,您必須將它們放在檔案中);實現了所有 Haskell 98 和擴充套件;對與其他語言的介面有很好的支援;從某種意義上來說是“事實上的”標準。它還允許載入和測試已編譯的物件。
- NHC - 使用較少,沒有互動式環境,但與 GHC 相比,它生成的執行檔案更小,通常執行速度更快;支援 Haskell98 和一些擴充套件。
我個人安裝了所有這些系統,並將其用於不同的目的。我傾向於使用 GHC 編譯(主要是因為我最熟悉它),並使用 Hugs 互動式環境,因為它快得多。因此,這就是我建議的。但是,要下載和安裝那麼多東西,如果您必須選擇一個,我會選擇 GHC,因為它既包含編譯器又包含互動式環境。
以下是截至編寫本教程時關於如何下載和安裝這些系統的描述。它可能已經改變了 - 請參閱 Haskell 網站 以獲取最新資訊。
Hugs 支援幾乎所有 Haskell 98 標準(它缺少一些庫),以及許多高階/實驗性擴充套件,包括:多引數型別類、可擴充套件記錄、秩 2 多型性、存在量化、作用域型別變數和受限型別同義詞。
官方 Hugs 網頁位於 [1]。
如果您訪問該頁面,有一個名為“下載”的連結,它將帶您到下載頁面。從該頁面,您可以為您的計算機下載相應的 Hugs 版本。
下載 Hugs 後,安裝步驟會因您的平臺而異,但 Hugs 的安裝與您平臺上任何程式的安裝基本相同。
- 對於 Windows,當您單擊要下載的“msi”檔案時,
只需選擇“執行此程式”,安裝將自動開始。從那裡,只需按照螢幕上的說明進行操作。
- 對於 RPM,使用您最熟悉的任何 RPM 安裝程式。
- 對於原始碼,首先解壓縮檔案,然後解壓縮它。如果您使用的是不支援其他系統的系統,那麼您應該對系統足夠了解,能夠手動執行配置指令碼並建立內容。
在 Unix 機器上,Hugs 直譯器通常使用以下形式的命令列啟動:hugs [選項 | 檔案] ...
在 Windows 上,Hugs 可以透過從開始選單中選擇它或雙擊副檔名為 .hs 或 .lhs 的檔案來啟動。(本手冊假設 Hugs 已成功安裝在您的系統上。)
Hugs 使用選項來設定系統引數。這些選項以一個前導 + 或 - 為特徵,用於自定義直譯器的行為。Hugs 啟動時,直譯器會執行以下任務
- 處理環境中的選項。變數 HUGSFLAGS 儲存這些選項。在 Windows 95/NT 上,還會查詢登錄檔以獲取 Hugs 選項設定。
- 處理命令列選項。
- 初始化內部資料結構。尤其是,堆將在此時初始化,並且其大小在此時固定;如果您想使用與預設值不同的堆大小執行直譯器,那麼必須使用命令列、環境或登錄檔中的選項來指定。
- 載入序言檔案。直譯器將在 -P 選項指定的路徑上查詢序言檔案。如果在路徑目錄或當前目錄中找不到序言檔案(位於 Prelude.hs 檔案中),則 Hugs 將終止;沒有序言檔案,Hugs 無法執行。
- 載入命令列上指定的程式檔案。hugs f1 ... fn 命令的效果與使用 hugs 命令啟動 Hugs,然後鍵入 :load f1 ... fn 相同。尤其是,如果在嘗試載入指定檔案之一時出現問題,直譯器不會終止,但它將中止嘗試載入的命令。
以下部分描述了 Hugs 使用的環境變數和命令列選項。
列出所有選項需要佔用太多空間。此時最重要的選項是“+98”或“-98”。當您使用“+98”啟動 hugs 時,它處於 Haskell 98 模式,這將關閉所有擴充套件。當您處於“-98”模式時,您處於 Hugs 模式,所有擴充套件都已開啟。如果您下載了其他人的程式碼,並且在載入時遇到了問題,首先要確保您已正確設定“98”標誌。
有關 Hugs 選項的更多資訊,請參閱手冊:http://cvs.haskell.org/Hugs/pages/hugsman/started.html
要獲取 Hugs 相關的幫助,請訪問 Hugs 網頁。要獲取一般的 Haskell 幫助,請訪問 Haskell 網頁。
Glasgow Haskell Compiler (GHC) 是一個健壯、功能齊全、針對 Haskell 98 進行最佳化的編譯器和互動式環境;GHC 將 Haskell 編譯為本機程式碼或 C 程式碼。它實現了 Haskell 98 的許多實驗性語言擴充套件;例如:併發、外部語言介面、多引數型別類、作用域型別變數、存在量化和全稱量化、無箱型別、異常、弱指標等等。GHC 附帶一個分代垃圾收集器,以及一個空間和時間分析器。
訪問官方 GHC 網頁 GHC 下載最新版本。撰寫本教程時的當前版本是 5.04.2,可以從 GHC 下載頁面下載(點選“Download”連結)。從該頁面,您可以下載適合您的計算機的 GHC 版本。
下載完 GHC 後,安裝步驟會根據您的平臺而有所不同;但是,GHC 的安裝步驟與您平臺上任何其他程式的安裝步驟基本相同。
- 在 Windows 上,單擊要下載的“msi”檔案時,只需選擇“執行此程式”,安裝將自動開始。然後,只需按照螢幕上的說明操作即可。
- 對於 RPM,使用您最熟悉的任何 RPM 安裝程式。
- 對於原始碼,首先解壓縮檔案,然後解壓縮它。如果您使用的是不支援其他系統的系統,那麼您應該對系統足夠了解,能夠手動執行配置指令碼並建立內容。
有關安裝過程的更詳細說明,請檢視 GHC 使用者手冊的“安裝 GHC”部分。
執行編譯器非常容易。假設您有一個在名為Main.hs的檔案中包含 main 函式的程式,您可以透過編寫以下命令來編譯它:
示例
% ghc --make Main.hs -o main
“--make”選項告訴 GHC 這是一個程式,而不僅僅是一個庫,您想要構建它以及它所依賴的所有模組。“Main.hs”指定要編譯的檔名稱;“ -o main”表示您要將輸出放在名為“main”的檔案中。
注意
在 Windows 中,您應該使用 “-o main.exe” 來告訴 Windows 這是一個可執行檔案。
然後,您只需在提示符下鍵入“./main”即可執行程式。
GHCi 透過命令“ghci”或“ghc --interactive”呼叫。還可以命令列指定一個或多個模組或檔名;這會指示 GHCi 載入指定的模組或檔名(以及它們所依賴的所有模組),就像您在 GHCi 提示符下輸入了 :load 模組一樣。
要在直譯器內獲得幫助,請在提示符下鍵入“:?”。要退出,請鍵入“:q”。要中斷正在執行的計算,請按 Ctrl-C。
列出所有選項會佔用太多空間。此時最重要的選項是 “-fglasgow-exts”。當您在沒有 “-fglasgow-exts” 的情況下啟動 GHCi 時,它處於 Haskell 98 模式,這會關閉所有擴充套件。當您使用 “-fglasgow-exts” 啟動時,所有擴充套件都將被啟用。如果您下載了別人的程式碼,並且在載入時遇到問題,請首先確保已正確設定此標誌。
有關 GHC 和 GHCi 選項的更多資訊,請參見 GHC 網頁上的手冊。
要獲得 GHC(i) 特定的幫助,請訪問 GHC 網頁。要獲得通用的 Haskell 幫助,請訪問 Haskell 網頁。
關於 NHC...
使用一個好的文字編輯器,程式設計會很有趣。當然,您也可以使用一個簡單的編輯器,它只能進行剪下貼上操作,但一個好的編輯器可以完成大多數瑣碎的工作,讓您可以專注於您正在編寫的內容。在 Haskell 程式設計方面,一個好的文字編輯器應該儘可能多地具備以下功能:
- 原始檔的語法高亮顯示
- 原始檔的縮排
- 與 Haskell 直譯器(無論是 Hugs 還是 GHCi)的互動
- 計算機輔助程式碼導航
- 程式碼補全
在撰寫本文時,有幾個選項可用:Emacs/XEmacs 透過haskell-mode 和伴隨的 Elisp 程式碼支援 Haskell(可從 [2] 獲取),以及...。%todo: 還有其他什麼?
還有哪些可用?...
(X)Emacs 似乎做得最好,擁有所有上面列出的功能。縮排功能瞭解 Haskell 的二維佈局規則(參見有關佈局 的部分),非常智慧,只有親眼看到才能相信。您可以藉助“Definitions”選單快速跳轉到所選函式的定義,並且當前正在編輯的函式名稱始終會顯示在模式行中。%todo: 更多?
