Given the Free Monad, and my Eq, Show, and Functor instances, I attempted to verify the first Functor law using QuickCheck:data Free f a = Var a               | Node (f (Free f a)) I defined the following Eq and Show instances (credit to duplode for helping me out on the Eq instance:instance (Eq (f (Free f a)), Eq a) => Eq (Free f a) where    (==) (Var x) (Var y)       = x == y    (==) (Node fu1) (Node fu2) = fu1 == fu2    (==) _ _                   = Falseinstance (Show (f (Free f a)), Show a) => Show (Free f a) where  show (Var x)  = Var  ++ (show x)  show (Node x) = Node  ++ (show x)Then, I implemented a Functor instance:instance Functor f => Functor (Free f) where  fmap g (Var x)  = Var (g x)  fmap g (Node x) = Node $ fmap (\y -> fmap g y) xAnd now the QuickCheck work:instance Arbitrary (Free Maybe Int) where    arbitrary = do        x <- arbitrary :: Gen Int        y <- arbitrary :: Gen Int        elements [Var x, Var y, Node (Nothing), Node (Just (Var y))] --fmap id = idfunctor_id_law ::  Free Maybe Int -> Boolfunctor_id_law x = (fmap id x) == (id x)Finally, run it in QuickCheck:ghci> quickCheck functor_id_law +++ OK, passed 100 tests.However, I haven't included other Functor's, such as [], etc. Nor have I used other types, i.e. Char, String, etc.What's a more rigorous approach to verifying that my definition of the Free Monad's Functor instance obeys the first Functor Law?
Using QuickCheck to Verify Free Monad's Functor Instance
haskell