2012-03-07 5 views
2

私はハスケルを学んでおり、私はTDDをしたいです。 関数が予期される例外を発生させるかどうかをテストしようとしています。 私はHUnitとtestpackを使用しています。HaskellでtestpackからassertRaisesを使用するには?

testpackがassertRaises機能を提供しますが、私は私のコードをコンパイルするために管理していない:(

ここに私のソースコードは次のとおりです。

module Main where 
import Test.HUnit 
import Test.HUnit.Tools 
import Control.Exception 

foo n | n > 2 = throw (IndexOutOfBounds ("Index out of bounds : " ++ (show n))) 
foo n | otherwise = n 

testException = TestCase(assertRaises "throw exception" (IndexOutOfBounds "Index out of bounds : 4") (foo 4)) 

main = runTestTT (TestList [ testException ]) 

私はGHCでコンパイルしたとき、私は、次のエラーメッセージが表示されます:

test_exceptions.hs:10:107: 
    No instance for (Ord (IO a0)) 
     arising from a use of `foo' 
    Possible fix: add an instance declaration for (Ord (IO a0)) 
    In the third argument of `assertRaises', namely `(foo 4)' 
    In the first argument of `TestCase', namely 
     `(assertRaises 
      "throw exception" 
      (IndexOutOfBounds "Index out of bounds : 4") 
      (foo 4))' 
    In the expression: 
     TestCase 
     (assertRaises 
      "throw exception" 
      (IndexOutOfBounds "Index out of bounds : 4") 
      (foo 4)) 

test_exceptions.hs:10:111: 
    No instance for (Num (IO a0)) 
     arising from the literal `4' 
    Possible fix: add an instance declaration for (Num (IO a0)) 
    In the first argument of `foo', namely `4' 
    In the third argument of `assertRaises', namely `(foo 4)' 
    In the first argument of `TestCase', namely 
     `(assertRaises 
      "throw exception" 
      (IndexOutOfBounds "Index out of bounds : 4") 
      (foo 4))' 

何が問題になっています

答えて

3

?は、その第3引数がIOアクション(型がIO a)であることを期待していますが、fooの戻り値の型は数値(型は(Num a, Ord a) => a)であり、IOアクションではありません。

(foo 4)(evaluate (foo 4))に置き換えてください。

+1

私はここで怠惰のために 'return'が動作しないと思います。しかし、「評価する」は仕事をしなければならない。 – hammar

+0

@ハマーどのように私のぞっとする。ありがとう。 – dave4420

+0

@ dave4420ありがとう:) –

関連する問題