【问题标题】:How to test my haskell functions如何测试我的 haskell 函数
【发布时间】:2011-10-13 08:19:43
【问题描述】:

我刚开始使用 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”,它就可以正常工作。

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

【问题讨论】:

    标签: haskell hugs


    【解决方案1】:

    其他人已经说过如何解决您当前的问题,但对于测试,您应该使用QuickChecksome other automated testing library

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

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

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

    【讨论】:

    • 这就是我要提议的。虽然,如果你想在自定义数据类型上使用它,它需要你与类型类交朋友,但它会很快付出代价!
    • 感谢您的提示。一旦我对 Haskell 更熟悉一点,我就会研究它 - 我今天才开始 :)
    【解决方案2】:

    对初学者最友好的方式可能是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 克里斯

    【讨论】:

    • 这看起来正是我想要的样子!
    【解决方案3】:

    做一个顶级定义:

    add :: Integer -> Integer -> Integer
    add a b = a + b
    
    test1 = add 2 3
    

    然后在 Hugs 会话中调用 test1。

    【讨论】:

    • 好的,这很好用。因此,我可以编写一些测试,例如“test1=add 2 3 == 5”,然后将所有必须等于 true 的测试结合起来。
    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

      如果您安装了 ghc,则 runhaskell 命令将解释并运行您文件中的 main 函数。

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

      然后在命令行上

      > runhaskell Add.hs
      5
      

      不确定,但拥抱可能具有与 runhaskell 命令类似的功能。或者,如果您将文件加载到 hugs 解释器中,您只需调用 main 即可运行它。

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-31
          • 2019-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-26
          • 1970-01-01
          相关资源
          最近更新 更多