首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell HUnit函数测试

Haskell HUnit函数测试
EN

Stack Overflow用户
提问于 2020-05-13 04:21:40
回答 1查看 79关注 0票数 0

我正在尝试为我用Haskell编写的一个简单的tic tac toe程序设置一系列测试,但我无法通过我的第一个测试,因为抛出了一个奇怪的错误:

代码语言:javascript
复制
Tests.hs:11:61: error:
    * Couldn't match expected type `Int' with actual type `IO Int'
    * In the third argument of `assertEqual', namely
        `(test_user_value x)'
      In the first argument of `TestCase', namely
        `(assertEqual "for (test_user_value 3)," f (test_user_value x))'
      In the expression:
        TestCase
          (assertEqual "for (test_user_value 3)," f (test_user_value x))
   |
11 | test1 = TestCase (assertEqual "for (test_user_value 3)," f (test_user_value x))
   |                                                             ^^^^^^^^^^^^^^^^^
Failed, one module loaded.

值'x‘是一个int,但Haskell将其读取为'IO Int’,这是错误的,因为我已经指定了"x ::Int“。被测试的函数已经被指定为"test_user_value ::Int -> IO Int“,所以我不确定为什么它不能正确地解释变量。如有任何建议,我们将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-13 04:52:08

它实际上并不是在抱怨x,而是在抱怨表达式test_user_value x -请注意,错误消息中带下划线的正是这个表达式。

正如您所指出的,因为test_user_value :: Int -> IO Intx :: Int遵循test_user_value x :: IO Int -而这正是编译器告诉您不应该出现在那里的。它需要一个Int,但您给了它IO Int

不过,您可以从中获得一个Int。要做到这一点,我认为do符号是最清晰的:

代码语言:javascript
复制
test1 = TestCase $ do
    v <- test_user_value x
    assertEqual "for (test_user_value 3)," f v

或者,您可以使用=<<运算符将其写得更短:

代码语言:javascript
复制
test1 = TestCase (assertEqual "for (test_user_value 3)," f =<< test_user_value x)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61761223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档