首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有类型错误的HUnit TestCase

带有类型错误的HUnit TestCase
EN

Stack Overflow用户
提问于 2011-03-23 19:59:51
回答 2查看 656关注 0票数 3

我编写了一个类似LISP的flatten的函数

代码语言:javascript
复制
data NestedList a = Elem a | List [NestedList a]

flatten :: NestedList a -> [a]
flatten (Elem x) = [x]
flatten (List xs) = concatMap flatten xs

这两个测试用例运行良好:

代码语言:javascript
复制
test1 = TestCase (assertEqual "test singleton" [5] (flatten (Elem 5)))
test2 = TestCase (assertEqual "test mixed" 
                              [1,2,3,4]
                              (flatten (List [Elem 1, 
                                              List [Elem 2, Elem 3],
                                              Elem 4])))

然而,这一次报告一个类型错误:

代码语言:javascript
复制
test3 = TestCase (assertEqual "test empty" [] (flatten (List [])))

来自REPL的测试运行良好:

代码语言:javascript
复制
*Main> [] == flatten (List [])
True

为什么我会得到一个错误,我应该如何为一个空列表编写一个测试用例?

编辑:这里是确切的错误消息:

代码语言:javascript
复制
Ambiguous type variable `a0' in the constraints:
  (Show a0) arising from a use of `assertEqual'
            at D:\haskell\source.hs:61:19-29
  (Eq a0) arising from a use of `assertEqual'
          at D:\haskell\source.hs:61:19-29
Probable fix: add a type signature that fixes these type variable(s)
In the first argument of `TestCase', namely
  `(assertEqual "test empty" [] (flatten (List [])))'
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-23 20:20:24

我猜问题是编译器找不出空列表的类型。可能是[Int][Char],任何真正的东西。试着给它一些类型,哪种类型完全不重要。

test3 = TestCase (assertEqual "test empty" ([] :: [Int]) (flatten (List [])))

注在其他情况下,编译器可以推断列表的类型。

票数 7
EN

Stack Overflow用户

发布于 2011-03-23 20:20:40

正如错误消息已经告诉您的,您必须将类型签名添加到单元测试中的列表中。可能是这样的:

代码语言:javascript
复制
test3 = TestCase (assertEqual "test empty" ([]::[()]) (flatten (List [])))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5410919

复制
相关文章

相似问题

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