unsafeVacuous
in Data.Void.Unsafe
e .#
e #.
in Data.Profunctor.Unsafe
entrambi avvertono sui pericoli dell'utilizzo di quelle funzioni con funtori/profuncatori che sono GADT. Alcuni esempi pericolosi sono evidenti:Proprio quando non sono sicuri, #., E. # Non sicuri?
data Foo a where
P :: a -> Foo a
Q :: Foo Void
instance Functor Foo where
fmap f (P x) = P (f x)
fmap f Q = P (f undefined)
Qui, unsafeVacuous Q
produrrà un costruttore Q
con un tipo fasullo.
Questo esempio non è molto preoccupante perché non sembra nemmeno lontanamente come un'istanza ragionevole Functor
. Ci sono esempi che fanno? In particolare, sarebbe possibile costruire quelli che obbediscono alle leggi del funtore/profunctor quando vengono manipolati usando solo le loro API pubbliche, ma si rompono orribilmente di fronte a queste funzioni non sicure?
Per quanto sopra 'Foo' penso che sia impossibile creare un'istanza di functor rispettosa della legge. Mi chiedo quali tipi di GADT permettano di farlo. Sembra che avere un costruttore 'K :: ... -> Foo T' impedisce qualsiasi istanza di functor a meno che' T' sia una variabile di tipo. (Forse sto trascurando qualcosa, però ...) – chi