我刚开始使用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)
如果我删除最后一行,加载脚本然后在拥抱解释器中键入“add 2 3”,它就可以了。
所以问题是:如何将函数调用放在与函数定义相同的脚本中?我只想加载脚本,并能够检查它是否符合我的预期...我不想一直手动输入它们。
答案 0 :(得分:12)
其他人已经说过如何解决您的问题,但是对于测试,您应该使用QuickCheck或some other automated testing library。
import Test.QuickCheck
prop_5 = add 2 3 == 5
prop_leftIdentity n = add 0 n == n
然后在Hugs会话中运行quickCheck prop_5
和quickCheck prop_leftIdentity
。 QuickCheck可以做很多事情,但这会让你开始。
(这是一个QuickCheck tutorial,但它已经过时了。有人知道一个涵盖QuickCheck 2吗?)
答案 1 :(得分:7)
最初学者友好的方式可能是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 Chris
答案 2 :(得分:3)
制作顶级定义:
add :: Integer -> Integer -> Integer
add a b = a + b
test1 = add 2 3
然后在Hugs会话中调用test1。
答案 3 :(得分:2)
总之,你不能。将其包装在一个函数中并调用它。您的文件充当有效的Haskell模块,并且具有“飞行”表达式不是编写它的有效方式。如何将函数调用放在与函数定义相同的脚本中?我只想加载脚本,并能够检查它是否符合我的预期...我不想一直手动输入它们。
您似乎来自脚本语言背景,但不要尝试将Haskell视为其中之一。
答案 4 :(得分:0)
如果您安装了ghc,则runhaskell
命令将解释并运行文件中的main
功能。
add x y = x + y
main = print $ add 2 3
然后在命令行上
> runhaskell Add.hs
5
不确定,但拥抱可能与runhaskell
命令具有相似的功能。或者,如果您将文件加载到拥抱解释器中,则可以通过调用main
来运行它。
答案 5 :(得分:0)
我试图做同样的事情,我只是做了一个遍历所有测试用例的函数(使用防护),如果它们全部通过则返回1,如果失败则抛出错误。
test :: Num b => a-> b
测试x
| sumALL [1] // = 1 =错误“测试失败”
| sumALL [0,1,2] // = 3 =错误“测试失败”
...
|否则= 1