跳转到内容

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
华夏公益教科书