Learn Haskell课程作业自动化:使用Stack实现测试与构建
【免费下载链接】learnhaskell Learn Haskell 项目地址: https://gitcode.com/gh_mirrors/le/learnhaskell
作为Haskell学习者,你是否还在手动编译代码、逐个运行测试用例?是否经常遇到环境配置不一致导致的"在我电脑上能运行"问题?本文将带你使用Stack(Haskell的构建工具)实现课程作业的自动化测试与构建,让你专注于代码逻辑而非繁琐操作。完成后,你将获得一套可复用的自动化流程,实现一行命令完成构建、测试和打包。
Stack工具简介
Stack是Haskell的项目构建工具,集成了包管理、依赖解析、编译和测试功能。相比传统的Cabal工具,Stack提供了更一致的构建环境和更简单的命令集,特别适合课程作业场景。项目install.md中已明确推荐使用Stack替代旧版GHC+Cabal安装方式。
Stack的核心优势:
- 自动管理GHC版本,避免"版本地狱"
- 可复现的构建环境,确保作业在任何机器上行为一致
- 内置测试框架集成,一键运行所有测试用例
- 与主流编辑器(如VS Code、Vim)无缝协作
环境准备与项目初始化
安装Stack
根据操作系统选择对应安装方式:
Ubuntu/Debian:
sudo apt-get install haskell-stack
macOS:
brew install haskell-stack
Windows: 从Stack官网下载安装程序,或使用Chocolatey:
choco install haskell-stack
验证安装:
stack --version
克隆课程仓库
git clone https://gitcode.com/gh_mirrors/le/learnhaskell
cd learnhaskell
创建作业项目
在仓库内为作业创建独立项目:
stack new my-homework simple --resolver lts-20.3
cd my-homework
自动化构建配置
项目结构解析
Stack创建的标准项目结构:
my-homework/
├── app/ # 可执行程序源码
│ └── Main.hs # 主程序入口
├── src/ # 库代码
│ └── Lib.hs # 作业核心逻辑
├── test/ # 测试代码
│ └── Spec.hs # 测试用例
├── package.yaml # 项目配置 (重点)
└── stack.yaml # Stack配置
配置package.yaml
编辑package.yaml文件,添加作业相关信息:
name: my-homework
version: 0.1.0.0
github: "gh_mirrors/le/learnhaskell"
license: MIT
author: "Your Name"
maintainer: "your.email@example.com"
copyright: "2025 Your Name"
extra-source-files:
- README.md
description: "Haskell课程作业"
dependencies:
- base >= 4.7 && < 5
- containers # 作业可能需要的容器库
- text # 文本处理库
library:
source-dirs: src
executables:
homework-exe:
main: Main.hs
source-dirs: app
dependencies:
- my-homework
tests:
homework-test:
main: Spec.hs
source-dirs: test
dependencies:
- my-homework
- hspec # 测试框架
- QuickCheck # 属性测试库
测试自动化实现
编写测试用例
编辑test/Spec.hs文件,使用Hspec框架编写测试:
import Test.Hspec
import Lib (reverseList, fibonacci) -- 导入作业函数
main :: IO ()
main = hspec $ do
describe "reverseList" $ do
it "反转空列表" $
reverseList [] `shouldBe` []
it "反转数字列表" $
reverseList [1,2,3] `shouldBe` [3,2,1]
it "反转字符串列表" $
reverseList ["a","b","c"] `shouldBe` ["c","b","a"]
describe "fibonacci" $ do
it "计算第0个斐波那契数" $
fibonacci 0 `shouldBe` 0
it "计算第5个斐波那契数" $
fibonacci 5 `shouldBe` 5
it "计算第10个斐波那契数" $
fibonacci 10 `shouldBe` 55
集成Makefile自动化
项目根目录的Makefile提供了PDF生成功能,我们可以扩展它支持作业自动化:
编辑项目根目录的Makefile,添加:
HOMEWORK_DIR = my-homework
# 构建作业
homework-build:
cd $(HOMEWORK_DIR) && stack build
# 运行作业测试
homework-test:
cd $(HOMEWORK_DIR) && stack test --coverage
# 生成作业文档
homework-doc:
cd $(HOMEWORK_DIR) && stack haddock --open
# 清理构建产物
homework-clean:
cd $(HOMEWORK_DIR) && stack clean
日常开发流程
编码与测试循环
- 编辑src/Lib.hs实现作业功能
- 运行测试验证正确性:
make homework-test
测试通过时的输出示例:
my-homework-0.1.0.0: test (suite: homework-test)
reverseList
反转空列表
反转数字列表
反转字符串列表
fibonacci
计算第0个斐波那契数
计算第5个斐波那契数
计算第10个斐波那契数
Finished in 0.0025 seconds
6 examples, 0 failures
生成文档
为作业代码生成HTML文档:
make homework-doc
命令会自动打开浏览器显示文档,包含函数类型签名、参数说明和使用示例。
提交作业前检查
提交前运行完整检查流程:
make homework-clean homework-build homework-test homework-doc
确保所有步骤无错误后,将代码提交到版本控制系统。
编辑器集成
Vim配置
根据tools.md中的建议,配置Vim自动构建:
autocmd FileType haskell setlocal makeprg=stack\ build
autocmd FileType haskell setlocal errorformat=%f:%l:%v:%m
在Vim中运行测试:
:make test
VS Code配置
安装Haskell插件后,在.vscode/settings.json中添加:
{
"haskell.stackPath": "/usr/local/bin/stack",
"haskell.formatOnSave": true,
"haskell.checkProject": true
}
常见问题解决
依赖冲突
当遇到依赖版本冲突时,删除stack.yaml.lock并重新构建:
rm stack.yaml.lock
stack build
测试失败排查
使用详细日志运行单个测试:
stack test --test-arguments "--match=reverseList" -v
GHC版本问题
项目install.md中提到Stack会自动管理GHC版本,如需指定特定版本,修改stack.yaml:
resolver: lts-20.3 # 选择合适的LTS版本
总结与扩展
通过本文,你已掌握使用Stack实现Haskell课程作业自动化的核心技能:
- 使用Stack创建和管理项目
- 编写自动化测试用例
- 配置一键构建流程
- 集成编辑器提高开发效率
进阶方向:
- 添加CI/CD: 将自动化流程集成到GitLab CI或GitHub Actions
- 性能分析: 使用
stack build --profile分析代码性能瓶颈 - 代码覆盖率: 扩展测试覆盖所有函数路径,追求100%覆盖率
- 文档自动化: 结合Makefile中的Pandoc配置,自动生成PDF报告
查看项目specific_topics.md获取更多Haskell高级主题,或参考guide-zh_CN.md的中文教程深入学习。
【免费下载链接】learnhaskell Learn Haskell 项目地址: https://gitcode.com/gh_mirrors/le/learnhaskell
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



