1

99個のHaskell問題を解いてHaskellを学び始めています。 http://www.haskell.org/haskellwiki/H-99:_Ninety-Nine_Haskell_Problems クイックチェックを使用して、各プログラム/関数のテストを書きたいと思います。

次のコードがあります。

インポート Test.QuickCheck
import Text.Printf

main = mapM_ (\(s,a) -> printf "%-25s: " s >> a) テスト

-- 1
myLast lst = 最後の lst
prop_1a xs x = myLast (xs ++ [x]) == (x::文字列)

myLast' = head . 逆行する
prop_1b xs x = myLast' (xs ++ [x]) == (x::文字列)

tests = [("1a", quickCheck prop_1a)
         ,(「1b」、quickCheck prop_1b)
         ]

myLast''、などと書くかもしれませんmyLast'''。コードを複製してプロパティをクイックチェックすることなく、これらすべてのメソッドをテストできる方法はありますか?

関連する質問: 現在、quickcheck に文字列を使用するように指示しています。さまざまなタイプをランダムに使用してテストする方法はありますか?

4

2 に答える 2

6

別の引数としてテストする関数を使用してください。

prop_1 last xs x = last (xs ++ [x]) == (x :: Int)

tests = zipWith mkTest ['a'..] [myLast, myLast']
  where mkTest letter func = ('1':[letter], quickCheck $ prop_1 func)
于 2011-10-05T18:28:28.720 に答える
2

コードを複製してプロパティをクイックチェックすることなく、これらすべてのメソッドをテストできる方法はありますか?

関数のリストを受け取り、それぞれをチェックするように小道具を書いてみませんか? 次に、として実行しますquickCheck (myProp [myLast, myLast', myLast''])

編集: :P 上で言ったようにそれを行うにはmyProp、関数のリストを取得する必要があり、それらはすべて と同じ型を持ちlast、ブール値を返します:

myProp :: [([a] -> a)] -> Bool

しかし、今見てみると、リストとアイテムも取る方が良い(そして元のアプローチに似ている)かもしれないので、代わりにそれを行うと思います:

myProp :: [([a] -> a)] -> [a] -> a -> Bool

リストが空の場合、true を返します。

myProp [] _ _ = True

そうでない場合は、プロパティがリストの最初の関数に対して保持されているかどうかを確認し、リストの残りを再帰的に確認します。

myProp [f:fs] xs x = f (xs ++ [x]) == x && myProp fs xs x

(なぜあなたがx::Stringあなたの実装に書いたのかわかりません。私はあなたがそれを必要とするべきではないと思います-last文字列のリストだけでなく、あらゆるリストで動作します。しかし、私は実際にこれをテストしていないので、あなたが持っていたと思います.正当な理由。)

とにかく、うまくいくはずだと思いますが、実際には試していません。私が作った可能性のある愚かな構文エラーなどを自由に編集して修正してください。

于 2011-10-05T18:22:14.107 に答える