3

HUnitを使用して、TDD方式でRealWorldHaskellの演習を実行しようとしています。ご想像のとおり、私はまだ遠くまで来ていないので、Haskellに関しては絶対的な初心者です。次のコードが与えられた場合、ghciが生成する次のエラーをどのように解決できますか?

あいまいな型変数List_Test.hs:6:27-58での `assertEqual'の使用から生じるEqa'の使用から生じる'を表示します。考えられる修正:これらの型変数を修正する型シグネチャを追加しますa' in the constraints: assertEqual' at List_Test.hs:6:27-58

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定義の両方に型制約を追加しようとしましたが、成功しませんでした。インターネット検索でも情報は得られませんでした。

4

1 に答える 1

6

toList Nil問題の一部は、GHCが空のリストを返すことを認識していないことです。

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

型のリストを返すことだけを知っていますがa、それが何でaあるかはわかりません。したがって、「あいまいな型変数a」メッセージです。これを回避する1つの方法は、toListが返すリストのタイプを指定することです。

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

これを変更し、List_Testの最初の2行を削除すると(main名前の付いていない名前の付いたモジュールで関数は検索されませんMain)、次の結果が得られました。

$ runghc List_Test.hs
ケース:1試行:1エラー:0失敗:0
于 2009-09-13T22:13:57.723 に答える