FreeモナドのベースとなるFunctorは、GHCのDeriveFunctor拡張を使って、対象のデータ型にderiving Functorをつけることで
できます。
例
{-# LANGUAGE DeriveFunctor #-} import Control.Monad.Free data CharIOBase a = GetCh (Char -> a) | PutCh Char a | EmbedIO (IO a) deriving Functor type CharIO = Free CharIOBase
とすると、
https://github.com/ghc/ghc/blob/ghc-7.6.2-release/compiler/typecheck/TcGenDeriv.lhs#L1407 の規則に従い、
instance Functor CharIOBase where fmap f (GetCh g) = GetCh (f . g) fmap f (PutCh c a) = PutCh c (f a) fmap f (EmbedIO m) = EmbedIO (fmap f m)
のようなインスタンスが生まれます。