跳轉至內容

另一個 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

[編輯 | 編輯原始碼]

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: 更多?


華夏公益教科書