Haskell HUnit功能测试
Haskell HUnit Function Testing
我正在尝试为我在 Haskell 中编写的一个简单的井字游戏程序设置一系列测试,但由于一个奇怪的错误,我无法通过我的第一次测试抛出阅读:
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' 是一个整数,但 Haskell 将其读取为 'IO Int',这是错误的,正如我指定的 "x :: Int"。被测试的函数已经被指定为 "test_user_value :: Int -> IO Int" 所以我不确定为什么它会错误地解释变量。任何建议,将不胜感激。
它实际上并不是在抱怨 x
,而是在抱怨表达式 test_user_value x
- 请注意,错误消息中带下划线的正是这个表达式。
因为,正如您所指出的,test_user_value :: Int -> IO Int
和 x :: Int
,因此 test_user_value x :: IO Int
- 这正是编译器告诉您不应该存在的内容。它期待 Int
,但你给了它 IO Int
。
你可以从中得到一个 Int
。为此,我认为 do
符号是最清晰的:
test1 = TestCase $ do
v <- test_user_value x
assertEqual "for (test_user_value 3)," f v
或者您可以使用 =<<
运算符将其写得更短一些:
test1 = TestCase (assertEqual "for (test_user_value 3)," f =<< test_user_value x)
我正在尝试为我在 Haskell 中编写的一个简单的井字游戏程序设置一系列测试,但由于一个奇怪的错误,我无法通过我的第一次测试抛出阅读:
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' 是一个整数,但 Haskell 将其读取为 'IO Int',这是错误的,正如我指定的 "x :: Int"。被测试的函数已经被指定为 "test_user_value :: Int -> IO Int" 所以我不确定为什么它会错误地解释变量。任何建议,将不胜感激。
它实际上并不是在抱怨 x
,而是在抱怨表达式 test_user_value x
- 请注意,错误消息中带下划线的正是这个表达式。
因为,正如您所指出的,test_user_value :: Int -> IO Int
和 x :: Int
,因此 test_user_value x :: IO Int
- 这正是编译器告诉您不应该存在的内容。它期待 Int
,但你给了它 IO Int
。
你可以从中得到一个 Int
。为此,我认为 do
符号是最清晰的:
test1 = TestCase $ do
v <- test_user_value x
assertEqual "for (test_user_value 3)," f v
或者您可以使用 =<<
运算符将其写得更短一些:
test1 = TestCase (assertEqual "for (test_user_value 3)," f =<< test_user_value x)