gpt4 book ai didi

haskell - 人们通常如何开发 Haskell 模块?

转载 作者:行者123 更新时间:2023-12-02 09:00:10 27 4
gpt4 key购买 nike

很抱歉问了一个比较笼统的问题。我是 Haskell 的新手,我是那种通过深入研究问题并边解决问题边学习的人。因此,我开始开发一个 Haskell 模块,旨在进行简单的线性回归。这是我的目录设置:

mymod/
- mymod.cabal
- src/
-- MyMod/
--- Linear.hs
--- Linear/
---- Regression.hs
--- Data.hs
--- Data/
---- Examples.hs
- tst/

我的 cabal 文件如下所示:

library
exposed-modules: MyLib.Linear, MyLib.Linear.Classifier,
MyLib.Data, MyLib.Data.Examples
build-depends: base == 4.6.*
hs-source-dirs: src

现在,我正在编写 Examples 模块,它本质上是一个 CSV 文件解析器。看起来像这样:

module Exampels (load) where

import Text.ParserCombinators.Parsec
import Control.Applicative

examples = line `endBy` eol
line = cell `sepBy` (char ',')

cell :: GenParser Char st Double
cell = rd <$> many1 (noneOf ",\n")
where rd = read :: String -> Double

eol = char '\n'

load :: String -> Either ParseError [[Double]]
load input = parse examples "(unknown)" input

这是我编写的系统的第一个部分。我通过使用 mylib/src/MyLib/Data/ 中的 ghci:l Examples.hs 进行测试,然后使用 load "5\n" 并验证了结果。现在我想开始编写回归逻辑,但我想结合我已经编写的 CSV 解析器来测试此代码。人们通常如何测试这样的代码?

例如,在 Java 中,我通常会创建一个新包,其中包含一个包含 main 方法的类。对于 Java,这对我来说很简单,因为我了解类路径的工作原理,并且可以指导编译器查找我想要运行的类。我该如何在 Haskell 中做到这一点?

谢谢!

最佳答案

本质上有四种方法:编写测试、编写可执行文件、尝试 REPL (GHCI) 和编写基准测试。幸运的是,最新的 Cabal (1.18) 支持所有这些。也供引用我有一个项目,其中 exhibits some .

测试

当您需要测试某些功能时,最好的方法可能是编写单元测试。随着项目的发展不断积累测试是其可靠性的关键。

存在三个主要框架:HUnit用于单元测试,QuickCheck用于性能测试和doctest用于测试文档注释中的示例。还有圆顶框架,如 HTF ,它将 HUnit 和 QuickCheck 结合在一起,让您摆脱它们的一些样板文件。

在 Cabal 中,您可以将测试套件定义为具有自己设置的单独编译单元。 Here is an example 。然后您可以使用 cabal test 运行它们。

可执行文件

在某些情况下,测试并不能真正满足要求。标准案例是一个程序,它演示了应该如何使用该库。 Here is an example .

您还可以使用可执行文件作为沙箱来测试库的 API,但同样,更明智的方法是编写测试。

您可以使用cabal run [name]运行可执行文件,如果需要消除歧义(即,当您有多个可执行文件时),其中“名称”指定可执行文件名称。

REPL (GHCI)

主要的好处是,当您加载内部模块、运行它们的函数并在更新时重新加载它们时,它允许您在“实时”模式下试验项目模块的 API。这对于分析 API 可能很有用,但我个人发现上面的两种方法涵盖了我可能需要的大部分内容。

您可以使用cabal repl [name]在您的项目上运行 GHCI。

基准

Criterion是一个用于基准测试的单一主导库。与上面类似,您可以使用 benchmark [name] block 在 cabal 中声明基准可执行文件。然后您可以使用 cabal bench 运行它们。

关于haskell - 人们通常如何开发 Haskell 模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21655191/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com