In "Tipi di dati alla carte" Swierstra scrive che dato Free
(che egli chiama Term
) e Zero
è possibile implementare la monade Identità:Scrivendo la monade identità in termini di libera
data Term f a = Pure a
| Impure (f (Term f a))
data Zero a
Term Zero
è ora il Identità monade Capisco perché questo è. Il problema è che non riesco mai a usare Term Zero
come Monade a causa del fastidioso Functor f =>
vincolo:
instance Functor f => Monad (Term f) where
return x = Pure x
(Pure x) >>= f = f x
(Impure f) >>= t = Impure (fmap (>>=f) t)
Come faccio Zero
un funtore?
instance Functor Zero where
fmap f z = ???
Sembra che ci sia un trucco qui: Dal momento che non ci sono Zero
costruttori, Impure
non può essere utilizzato, e così il Impure
caso di >>=
non viene mai chiamato. Questo significa fmap
non è mai chiamato, quindi non c'è un senso in cui questo è ok:
instance Functor Zero where
fmap f z = undefined
Il problema è, questo si sente come barare. Cosa mi manca? Zero
è in realtà un Functional? O forse Zero
non è un Functor, e questo è un difetto di come esprimiamo Free
in Haskell?
sì, 'Zero' è un funtore da' Hask' a '0', la categoria vuota (che poi è incorporato di nuovo in Hask). –