Я пытаюсь выяснить разницу между unfold/coiter
от Control.Comonad.Cofree
и unfold/ana
от Data.Control.Fixedpoint
. Библиотеки хакеров - соответственно. free
и recursion-schemes
.Развернутый экземпляр для cofree comonad
Cofree
и Fix
, кажется, родственники, и я пытаюсь выяснить, что возможно с обоими и тем, что возможно только с одним из них.
Я мог бы написать экземпляр Foldable
для Cofree
так что я могу применить cata
к свободной монады, полученной из unfold/coiter
:
type instance Base (Cofree f a) = f
instance Functor f => Foldable (Cofree f a) where
project = unwrap
Но я не мог построить экземпляр:
instance Functor f => Unfoldable (Cofree f a) where
embed = xembed
xembed :: Functor f => f (Cofree f a) -> Cofree f a
xembed = undefined
Это вообще возможно?
Вы имеете в виду, что я не могу написать 'project' бесплатно монады и' embed' бесплатно comonads? – nponeccop
Да, я исправил это (это cofree comonad, а не бесплатный comonad! :-)). Однако теперь, когда я смотрел на то, что эти классы на самом деле, может быть, ваш тип «Base» просто не то, что вы хотите (я не совсем уверен, что вы после него). 'Cofree fa' является фиксированной точкой' \ self -> (a, f self) 'и' Free fa' является фиксированной точкой '\ self>> Либо (f self)', а не только 'f' , – shachaf