如何解决此单元测试中的类型歧义
How to resolve type ambiguity in this unit test
我不知道如何正确注释 mylast3 测试:
import Test.HUnit
mylast :: [a] -> Maybe a
mylast [] = Nothing
mylast [x] = Just x
mylast (_:xs) = mylast xs
testsMyLast =
[TestCase $ assertEqual "mylast1" (Just 1) $ mylast [1],
TestCase $ assertEqual "mylast2" (Just 'b') $ mylast "ab",
TestCase $ assertEqual "mylast3" Nothing $ mylast [] <== how to test this correctly?
]
main = do runTestTT $ TestList testsMyLast
我收到以下错误,指向 "TestCase $ assertEqual "mylast3":
行
No instance for (Show a0) arising from a use of assertEqual The type
variable a0 is ambiguous
由于列表[]
没有任何成员,只能从类型推导中推断出[]
是[a]
.
类型
要使列表成为 "showable",它必须是类型类 Show
的一个实例。如果列表的成员也是 Show
的实例,则列表只是 Show
的实例。
但是类型检查器无法将 []
的类型推断为比 [a]
更具体的类型。我们不能知道a
是否是Show
的实例所以我们也不能知道[a]
是否是依次是 Show
.
的实例
如果我们简单地注释一个特定的类型 ([] :: [Int])
就不会出现错误!
这是因为我们知道 Int
是 Show
的一个实例,因此 [Int]
也是 Show
的一个实例。现在编译器可以推断出打印列表所需的信息!
我不知道如何正确注释 mylast3 测试:
import Test.HUnit
mylast :: [a] -> Maybe a
mylast [] = Nothing
mylast [x] = Just x
mylast (_:xs) = mylast xs
testsMyLast =
[TestCase $ assertEqual "mylast1" (Just 1) $ mylast [1],
TestCase $ assertEqual "mylast2" (Just 'b') $ mylast "ab",
TestCase $ assertEqual "mylast3" Nothing $ mylast [] <== how to test this correctly?
]
main = do runTestTT $ TestList testsMyLast
我收到以下错误,指向 "TestCase $ assertEqual "mylast3":
行No instance for (Show a0) arising from a use of assertEqual The type variable a0 is ambiguous
由于列表[]
没有任何成员,只能从类型推导中推断出[]
是[a]
.
要使列表成为 "showable",它必须是类型类 Show
的一个实例。如果列表的成员也是 Show
的实例,则列表只是 Show
的实例。
但是类型检查器无法将 []
的类型推断为比 [a]
更具体的类型。我们不能知道a
是否是Show
的实例所以我们也不能知道[a]
是否是依次是 Show
.
如果我们简单地注释一个特定的类型 ([] :: [Int])
就不会出现错误!
这是因为我们知道 Int
是 Show
的一个实例,因此 [Int]
也是 Show
的一个实例。现在编译器可以推断出打印列表所需的信息!