<div dir="ltr"><div>Consider the illustrative code below: </div><div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><font face="monospace, monospace"><br></font></div><div><div><font face="monospace, monospace">{-# LANGUAGE GADTs #-}</font></div></div><div><div><font face="monospace, monospace">{-# LANGUAGE DataKinds #-}</font></div></div><div><div><font face="monospace, monospace">{-# LANGUAGE KindSignatures #-}</font></div></div><div><div><font face="monospace, monospace">{-# LANGUAGE RankNTypes #-}</font></div></div><div><div><font face="monospace, monospace">{-# LANGUAGE PolyKinds #-}</font></div></div><div><div><font face="monospace, monospace">{-# LANGUAGE StandaloneDeriving #-}</font></div></div><div><div><font face="monospace, monospace">{-# LANGUAGE UndecidableInstances #-}</font></div></div><div><div><font face="monospace, monospace"><br></font></div></div><div><div><font face="monospace, monospace">data Param = Param1 | Param2</font></div></div><div><div><font face="monospace, monospace"><br></font></div></div><div><div><font face="monospace, monospace">data T (p :: Param) where</font></div></div><div><div><font face="monospace, monospace">  TInt :: Int -> T Param1</font></div></div><div><div><font face="monospace, monospace">  TInteger :: Integer -> T Param1</font></div></div><div><div><font face="monospace, monospace">  TBool :: Bool -> T Param2</font></div></div><div><div><font face="monospace, monospace"><br></font></div></div><div><div><font face="monospace, monospace">data U (p :: Param) where</font></div></div><div><div><font face="monospace, monospace">  UDouble :: Double -> U Param1</font></div></div><div><div><font face="monospace, monospace">  UString :: String -> U Param2</font></div></div><div><div><font face="monospace, monospace">  </font></div></div><div><div><font face="monospace, monospace">data F (t :: Param -> *) where</font></div></div><div><div><font face="monospace, monospace">  F :: t Param1 -> t Param2 -> F t</font></div></div><div><div><font face="monospace, monospace">  </font></div></div><div><div><font face="monospace, monospace">f :: T a -> U a</font></div></div><div><div><font face="monospace, monospace">f (TInt x) = UDouble (fromIntegral x)</font></div></div><div><div><font face="monospace, monospace">f (TInteger x) = UDouble (fromIntegral x)</font></div></div><div><div><font face="monospace, monospace">f (TBool x) = UString (show x)</font></div></div><div><div><font face="monospace, monospace"><br></font></div></div><div><div><font face="monospace, monospace">class MyFunctor f where</font></div></div><div><div><font face="monospace, monospace">  myFmap :: (forall a. t a -> u a) -> f t -> f u</font></div></div><div><div><font face="monospace, monospace">  </font></div></div><div><div><font face="monospace, monospace">instance MyFunctor F where</font></div></div><div><div><font face="monospace, monospace">  myFmap f (F x1 x2) = F (f x1) (f x2)</font></div></div><div><div><font face="monospace, monospace"><br></font></div></div><div><div><font face="monospace, monospace">deriving instance Show (U a)</font></div></div><div><div><font face="monospace, monospace">deriving instance (Show (t Param1), Show (t Param2)) => Show (F t)</font></div></div><div><div><font face="monospace, monospace"><br></font></div></div><div><div><font face="monospace, monospace">main = print $ myFmap f (F (TInt 42) (TBool False))</font></div></div></blockquote></div><div><br></div><div>Basically this is a sort of "higher order" functor, but I can't seem to fit it into an ordinary functor. </div><div><br></div><div>But it seems like I'm reinventing the wheel, as my code is suspiciously like `Functor` but only slightly different. </div><div><br></div><div>Has this sort of class already been created and if so what package is it in?</div><div><br></div><div><br></div></div>