Free Monad, and my
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
Show instances (credit to duplode for helping me out on the
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 (==) _ _ = False instance (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
instance Functor f => Functor (Free f) where fmap g (Var x) = Var (g x) fmap g (Node x) = Node $ fmap (\y -> fmap g y) x
And 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 = id functor_id_law :: Free Maybe Int -> Bool functor_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.
What's a more rigorous approach to verifying that my definition of the
Functor instance obeys the first Functor Law?