代码之家  ›  专栏  ›  技术社区  ›  Bas Bossink

如何使用断言等于参数化类型

  •  3
  • Bas Bossink  · 技术社区  · 15 年前

    我正在尝试用TDD的方式在现实世界中进行练习,使用 HUnit . 正如你可能猜到的,我还没走多远,所以说到哈斯克尔,我绝对是个初学者。给定以下代码,我如何解决GHCI产生的以下错误:

    不明确的类型变量 a' in the constraints: 显示一个 由于使用 assertEqual' at List_Test.hs:6:27-58 在列表测试中使用“assertequal”产生的等式A。hs:6:27-58 可能修复:添加修复这些类型变量的类型签名

    ListyTest.HS:

    module List_Test
    where
    import List
    import Test.HUnit
    
    fromEmptyList = TestCase $ assertEqual "" [] (toList (Nil))
    
    main = runTestTT fromEmptyList
    

    列表.hs:

    module List
    where
    data List a = Cons a (List a)
                | Nil
                  deriving (Show)
    
    toList Nil = []
    toList (Cons a b) = (:) a (toList b) 
    

    我尝试向列表声明和to list定义添加类型约束,但没有成功。互联网搜索也没有提供任何信息。

    1 回复  |  直到 11 年前
        1
  •  6
  •   Mark Rushakoff    15 年前

    部分原因是GHC不知道 toList Nil 将返回空列表。

    *List> :i toList
    toList :: List a -> [a]     -- Defined at List.hs:7:0-5
    

    它只知道它将返回类型的列表 a 但不知道是什么 是——因此是“含糊不清的类型变量A”消息。解决此问题的一种方法是只指定ToList将返回的列表类型:

    fromEmptyList = TestCase $ assertEqual "" [] (toList (Nil) :: [Int])
    

    更改它,并删除列表测试的前两行(它不会查找 main 未命名的已命名模块中的函数 Main ,给了我这个结果:

    $ runghc List_Test.hs 
    Cases: 1  Tried: 1  Errors: 0  Failures: 0
    
    推荐文章