3

私は現在、本Thinking with Typesに取り組んでいます。第 3 章のVarianceでは、著者は、読者が のファンクター インスタンスを実装する必要がある演習を提供しますT1

newtype T1 a = T1 (Int -> a)

この型チェックを行ういくつかの方法を見つけまし

instance Functor T1 where
  fmap f (T1 a) = T1 (f . a)

…と

instance Functor T1 where
  fmap f (T1 a) = T1 (f <$> a)

もちろん、インスタンス型のチェックを行うだけでは、インスタンスがファンクターの法則を尊重するわけではありません。私が書いたインスタンスが正しいことをテストする (そして、上記のインスタンスの少なくとも 1 つが間違っていることを示す) ために、いくつかのプロパティ ベースのテストを書きたいと思います。

自分のテストを書くために、 hedgehog-classesライブラリを使用したいと考えています。このライブラリは、必要になると思われる機能lawsCheckと機能を提供します。functorLawsGHCi の次の行でインスタンスをテストできると思います

> lawsCheck (functorLaws genT1)

私が見逃しているのはgenT1、1つ(またはおそらく複数?実際にはそうあるべきgenT1Listですか?)のランダムT1値を生成すると想像する の書き方です。ラップするランダムな値を作成できるように、 hedgehog-fn のようなものを使用して任意の関数を生成する必要がありますか? もしそうなら、どのように?(Int -> a)T1

4

0 に答える 0