unison/unison-src/Cofree.u
2019-05-13 17:36:04 -04:00

22 lines
483 B
Plaintext

type Cofree f a = Cofree a (f (Cofree f a))
type Functor f = Functor (forall a b. (a ->{} b) -> f a ->{} f b)
use Functor Functor
fmap : Functor f -> (a -> b) -> f a -> f b
fmap fn f = case fn of
Functor map -> map f
use Cofree Cofree
namespace Cofree where
extract : Cofree f a -> a
extract c = case c of
Cofree a _ -> a
duplicate : Functor f -> Cofree f a -> Cofree f (Cofree f a)
duplicate f c = case c of
Cofree a p -> Cofree c (fmap f (duplicate f) p)