8

rev3つの型クラスにある型の値を返す関数があります。

rev :: (Integral a, Show a, Read a) => a -> a
rev = read . reverse . show

クイックチェックでそれに関するいくつかのプロパティをテストしたいと思います。ただし、ベースライブラリに型がIntegerないために使用しているため、整数型の負の値をテストすることには興味がありません。Naturalだから私は、生成された値が負のときに生成された値の反対を取りましょう、そして私は大丈夫だと思いました:

prop_id :: (Integral a, Show a, Read a) => Positive a -> Bool
prop_id n | n >= 0    = (rev.rev) n == n
          | otherwise = let n' = -n in (rev.rev) n' == n'

(テストされたプロパティはここでは重要ではありません-特にそれは非常に基本的な値には当てはまりません、そして私はそれを知っています、それはこの質問の主題ではありません)

次に、修飾子に遭遇しPositive、テストは機能しているものの、より良い方法で実装するとよいと思いました。だから私は試しました:

prop_id :: (Integral a, Show a, Read a) => Positive a -> Bool
prop_id n = (rev.rev) n == n

それが編集されたとき、私は驚いたことを認めなければなりません。しかし、テストの実行時にエラーが発生しました。

*** Failed! Exception: 'Prelude.read: no parse' (after 1 test): 
Positive {getPositive = 1}

だから私は、「うーん、これPositiveをインスタンスとして宣言しなければならない」と思いましたRead。だから私はまさにそれをしました、しかしインスタンスはすでにquickCheckライブラリで宣言されています、それはghciが私に叫んだからだと思われます。

そして、この時点で私は迷子になっています。良いドキュメントが見つからないからです(もしあれば)。

クイックチェックライブラリの修飾子やその他の優れた点を理解するのに役立つポインタをいただければ幸いです。

4

1 に答える 1

19

これらの修飾子を使用する一般的な方法は、それらにパターンマッチングを行うことです。

prop_id :: (Integral a, Show a, Read a) => Positive a -> Bool
prop_id (Positive n) = (rev.rev) n == n

このようにn、基になるタイプがあります。

于 2012-09-17T20:30:56.710 に答える