2017-07-22 12 views
1

私は奇妙なHUnitの動作を経験しました。テストで条件が存在する場合、テストケースをコンパイルすることはできません。同じテストケースにおける条件Just 2 == Just 2が正常に動作することをテストで `Nothing == Nothing`条件が存在する場合、HUnitはテストケースをコンパイルできません

[2 of 2] Compiling TestTest   (Test/TestTest.hs, interpreted) 

Test/TestTest.hs:9:49: 
    No instance for (Eq a0) arising from a use of ‘==’ 
    The type variable ‘a0’ is ambiguous 
    Note: there are several potential instances: 
     instance Eq Counts -- Defined in ‘Test.HUnit.Base’ 
     instance Eq Node -- Defined in ‘Test.HUnit.Base’ 
     instance Eq State -- Defined in ‘Test.HUnit.Base’ 
     ...plus 53 others 
    In the second argument of ‘(~=?)’, namely ‘Nothing == Nothing’ 
    In the second argument of ‘(~:)’, namely 
     ‘True ~=? Nothing == Nothing’ 
    In the second argument of ‘(~:)’, namely 
     ‘"x == x" ~: True ~=? Nothing == Nothing’ 
Failed, modules loaded: Test.AssertError. 

注:エラー以下ghciリターンでこの内容のファイルをロードする

module TestTest where 

import Control.Exception 
import Control.Monad 
import Test.HUnit 
import Test.AssertError 

testTests = test [ 
    "test A01" ~: "x == x" ~: True ~=? Nothing == Nothing, 
    "test _" ~: "empty test" ~: True ~=? True 
    ] 

runTests :: IO Counts 
runTests = do 
    runTestTT testTests 

試み:ここでは、この動作を再現私のコードです。 ghciNothing == Nothingと入力すると、期待どおりTrueが返されます。

HUnitはこのように動作しますか?これはバグか期待される動作ですか?

+0

「おそらく」のタイプを指定する必要があります。 –

答えて

3

問題は2つのNothingを指定することであり、これらのどれもaのタイプが何であるかを示唆していません。もちろん、Nothingについては、それは問題ではないと考えることができます。しかし、ハスケルはそのような理由ではありません。それは "何を意味するのですか?"ということに興味があります。

タイプを明示的にすることで問題を解決できます。たとえば:

testTests = test [ 
    "test A01" ~: "x == x" ~: True ~=? (Nothing :: Maybe Int) == Nothing, 
    "test _" ~: "empty test" ~: True ~=? True 
    ]
+0

なぜ、 'ghci'の' Nothing == Nothing'を実行すると、型全体を明示的に指定せずに 'True'を返すのですか? – altern

+0

@altern: 'ghci'がタイプアースを延期するためです。それはすぐにはできないからです。 'ghc'はすべてのファイルを解釈して、これらについての理由を解釈します。 –

+7

@alternあいまいな型の状況で単形型を選択する[extended defaulting](https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/ghci.html#extended-default- rules) ghciではデフォルトでオンになっており、デフォルトでは他の場所でオフになっています。 –

関連する問題