5

我刚开始使用 Haskell 并尝试先编写一些测试。基本上,我想定义一些函数,然后调用这个函数来检查行为。

add :: Integer -> Integer -> Integer
add a b = a+b

-- Test my function 
add 2 3

如果我在 Hugs98 中加载那个小脚本,我会收到以下错误:

Syntax error in declaration (unexpected `}', possibly due to bad layout)

如果我删除最后一行,加载脚本,然后在 hugs 解释器中输入“add 2 3”,它就可以正常工作。

所以问题是:如何将我的函数调用与函数定义放在同一个脚本中?我只想加载脚本并能够检查它是否符合我的预期......我不想一直手动输入它们。

4

6 回答 6

14

其他人已经说过如何解决您当前的问题,但是对于测试,您应该使用QuickCheck其他一些自动化测试库

import Test.QuickCheck
prop_5 = add 2 3 == 5
prop_leftIdentity n = add 0 n == n

然后运行quickCheck prop_5quickCheck prop_leftIdentity在您的拥抱会话中。QuickCheck 可以做的远不止这些,但这会让你开始。

(这是一个QuickCheck 教程,但它已经过时了。有人知道涵盖 QuickCheck 2 的教程吗?)

于 2011-10-13T08:40:55.833 回答
8

对初学者最友好的方式可能是doctest模块。使用“cabal install doctest”下载它,然后将您的代码放入文件“Add.hs”并从命令行运行“doctest Add.hs”。

您的代码应如下所示,格式很重要:

module Add where

-- | add adds two numbers
--
-- >>> add 2 3
-- 5
-- >>> add 5 0
-- 5
-- >>> add 0 0
-- 0
add :: Integer -> Integer -> Integer
add a b = a+b

HTH 克里斯

于 2011-10-13T09:27:29.623 回答
3

进行顶级定义:

add :: Integer -> Integer -> Integer
add a b = a + b

test1 = add 2 3

然后在你的 Hugs 会话中调用 test1。

于 2011-10-13T08:25:30.900 回答
2

如何将我的函数调用与函数定义放在同一个脚本中?我只想加载脚本并能够检查它是否符合我的预期......我不想一直手动输入它们。

简而言之,你不能。将其包装在一个函数中并改为调用它。您的文件用作有效的 Haskell 模块,并且具有“飞行”表达式不是编写它的有效方式。

您似乎来自脚本语言背景,但不要尝试将 Haskell 视为其中之一。

于 2011-10-13T08:27:34.440 回答
0

If you have ghc installed, then the runhaskell command will interpret and run the main function in your file.

add x y = x + y
main = print $ add 2 3

Then on the command line

> runhaskell Add.hs
5

Not sure, but hugs probably has a similar feature to the runhaskell command. Or, if you load the file into the hugs interpreter, you can simply run it by calling main.

于 2011-10-13T22:39:53.367 回答
0

我试图做同样的事情,我只是创建了一个函数,它遍历了我所有的测试用例(使用警卫),如果它们都通过了,则返回 1,如果有任何失败则抛出错误。

测试 :: Num b => a->b
测试 x
      | sumALL [1] /= 1 = 错误“测试失败”
      | sumALL [0,1,2] /= 3 = 错误“测试失败”
      ...
      | 否则 = 1

于 2020-04-17T21:11:53.477 回答