私は現在、本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
と機能を提供します。functorLaws
GHCi の次の行でインスタンスをテストできると思います
> lawsCheck (functorLaws genT1)
私が見逃しているのはgenT1
、1つ(またはおそらく複数?実際にはそうあるべきgenT1List
ですか?)のランダムT1
値を生成すると想像する の書き方です。ラップするランダムな値を作成できるように、 hedgehog-fn のようなものを使用して任意の関数を生成する必要がありますか? もしそうなら、どのように?(Int -> a)
T1