Non sono sicuro come derivare l'istanza functor dopo aver fatto un punto fisso:bifunctor in Haskell, dopo il tipo meno fisso
data FreeF f a next = PureF a | FreeF (f next) deriving (Functor)
data Mu f = In { out :: f (Mu f) }
newtype Free f a = Free( Mu (FreeF f a) )
instance Functor f => Functor (Free f) where
fmap h (Free (out -> PureF a)) = Free (In (PureF (h a)))
fmap h (Free (out -> FreeF fn)) = Free (In (fmap undefined undefined)) --stuck
Se modifico Mu di accettare un parametro di tipo in più, posso progredire fino. ..:
data Mu f a = In { out :: f (Mu f a) } deriving (Functor)
newtype Free f a = Free( Mu (FreeF f a) a)
instance Functor f => Functor (Free f) where
fmap h (Free (out -> PureF a)) = Free . In . PureF $ h a
fmap h (Free (out -> FreeF fn)) = Free . In . FreeF $ fmap undefined fn
qui ho bisogno di avere undefined :: Mu (FreeF f a) a -> Mu (FreeF f b) b
ma mu f
è un funtore per lo stesso f
e qui varia in tipo.
Qual è il modo corretto per affrontare questo?
Non è 'In. out' ridondante?(entrambe le occorrenze) – chi
Lo è. Credo di aver seguito i buchi del tipo un po 'troppo stupidamente. Modificato. –