跳轉到內容

Haskell/獨立程式

來自華夏公益教科書

讓我們構建一個簡單的 Haskell 應用程式,即一個獨立的軟體。

Main 模組

[編輯 | 編輯原始碼]

其背後的基本要求是擁有一個名為 Main 的模組,該模組具有一個名為 main 且型別為 IO () 的入口點。

-- thingamie.hs
module Main where

main = putStrLn "Bonjour, world!"

我們已經知道如何將它載入到 GHCi 中,但這裡是如何編譯它並獨立執行它

$ ghc --make -o bonjourWorld thingamie.hs
$ ./bonjourWorld
Bonjour, world!

瞧!你現在擁有一個用 Haskell 構建的獨立應用程式。

其他模組

[編輯 | 編輯原始碼]

大多數程式會變得足夠複雜,需要拆分到不同的檔案中。這是一個使用兩個模組的應用程式的玩具示例。

-- Hello.hs
module Hello where

hello = "Bonjour, world!"
-- thingamie.hs
module Main where

import Hello

main = putStrLn hello

我們可以像以前一樣編譯這個新程式。這個--make標誌告訴 GHC 自動檢測您正在編譯的檔案中的依賴項。也就是說,由於thingamie.hs匯入了一個模組 Hello,GHC 將在當前目錄中的 Haskell 檔案中搜索實現 Hello 的檔案,並同時編譯它們。如果 Hello 依賴於其他模組,GHC 將自動檢測這些依賴項。

$ ghc --make -o bonjourWorld thingamie.hs
$ ./bonjourWorld
Bonjour, world!

您可能已經注意到,帶有 Main 模組的檔案thingamie.hs,沒有與模組名稱匹配的名稱,這與我們在 模組 章節中所說的相悖。這不是問題,因為模組和檔名匹配的目的是讓 GHC 自動找到這些檔案。由於這個過程總是從 Main 開始,我們在呼叫 GHC 時在命令列中指定了它的檔案,因此 Main 模組的檔案不需要遵循約定。

如果您想在其他地方搜尋原始檔(包括檔案和目錄的巢狀結構),您可以使用-i標誌新增依賴搜尋的起點。此標誌接受以冒號分隔的多個目錄名稱作為其引數。

作為一個人為的示例,以下程式有三個檔案,它們都儲存在一個src/目錄中。目錄結構如下

HaskellProgram/
   src/
      Main.hs
      GUI/
           Interface.hs
      Functions/
           Mathematics.hs

Main 模組透過搜尋類似於模組名稱的路徑來匯入它的依賴項——因此 import GUI.Interface 將搜尋GUI/Interface(帶有適當的副檔名)。

要從 HaskellProgram 目錄中編譯此程式,請使用以下命令呼叫 GHC

$ ghc --make -isrc -o sillyprog Main.hs
華夏公益教科書