我正在尝试为我用Haskell编写的一个简单的tic tac toe程序设置一系列测试,但我无法通过我的第一个测试,因为抛出了一个奇怪的错误:
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“,所以我不确定为什么它不能正确地解释变量。如有任何建议,我们将不胜感激。
发布于 2020-05-13 04:52:08
它实际上并不是在抱怨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)https://stackoverflow.com/questions/61761223
复制相似问题