Haskell/独立程序
让我们构建一个简单的 Haskell 应用程序,即一个独立的软件。
其背后的基本要求是拥有一个名为 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