2009-09-13 39 views
3

我正在嘗試使用HUnit以TDD方式在Real World Haskell中進行練習。正如你可能猜到的,我還沒有到很遠的地步,所以在Haskell方面我是一個絕對的初學者。考慮下面的代碼,我怎麼能解決以下錯誤ghci的生產:如何使用帶參數化類型的assertEqual

曖昧類型變量a' in the constraints: 顯示一個「 從使用assertEqual' at List_Test.hs:6:27-58 方程引起的」從List_Test.hs一個使用assertEqual便的`」產生的: 6:27-58 可能的修復:添加用於固定這些類型的變量(S)

List_Test.hs一個類型簽名:

module List_Test 
where 
import List 
import Test.HUnit 

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

main = runTestTT fromEmptyList 

List.hs:

module List 
where 
data List a = Cons a (List a) 
      | Nil 
       deriving (Show) 

toList Nil = [] 
toList (Cons a b) = (:) a (toList b) 

我試過向List聲明和toList定義添加類型約束而沒有成功。互聯網搜索也沒有提供任何信息。

回答

6

問題部分是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]) 

改變這一點,除去List_Test的前兩行(它不會尋找一個main功能命名模塊這不是命名爲Main),給了我這個結果:

 
$ runghc List_Test.hs 
Cases: 1 Tried: 1 Errors: 0 Failures: 0 
+0

謝謝,沒有意識到指定一個給定的函數調用返回類型的語法。 – 2009-09-13 22:21:13