另一個 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 標準(它缺少一些庫),以及許多高階/實驗性擴充套件,包括:多引數型別類、可擴充套件記錄、rank-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 編譯器 (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` 函式編寫的程式,該程式儲存在一個名為Main.hs的檔案中,你可以透過編寫以下命令來編譯它:
示例
% 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 modules 一樣。
要在直譯器中獲得幫助,請在提示符下鍵入 “:?”。要退出,請鍵入 “: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 程式碼(可從 [2] 獲取)支援 Haskell,以及… %todo: 其他還有哪些?
還有哪些可用?…
(X)Emacs 似乎做得最好,它包含了上面列出的所有功能。縮排功能能夠識別 Haskell 的二維佈局規則(請參閱有關 佈局 的部分),非常智慧,必須親眼看到才能相信。藉助 “Definitions” 選單,你可以快速跳轉到選定函式的定義,當前編輯的函式名稱始終顯示在模式行中。%todo: 還有其他功能嗎?
