J'ai une famille de type IfEq (n :: Nat) (m :: Nat) o
qui évalue à o
ou Void
en fonction de n :== m
. Puisque Maybe Void
est seulement inibited par Nothing
je devrais être capable de définir une fonction Maybe (IfEq n m o) -> Maybe o
mais je ne peux pas comprendre dehors.Convaincre GHC que `Peut-être Void` est un type d'unité
Suivi: Cela peut-il être généralisé de la monade Maybe
à un type plus général? (par exemple tous. MonadPlus
s)
EDIT: J'avais d'abord roulé ma propre Nat
mais (merci à ce @chi) avec le GHC Nat
genre KnownNat
constrait il assez simple de faire ce que je décris ci-dessus. Cependant GHC ne peut pas déduire KnownNat a => KnownNat (1+a)
qui est impératif pour moi donc je suis de retour à la case 1.
Vous ne pouvez pas définir une telle fonction (bien, vous pouvez simplement avoir 'juste x = erreur .. »mais je suppose que vous cherchez un moyen sûr de le faire) parce que vous ne pouvez pas faire correspondre un modèle. Au moins, vous auriez besoin de 'Typeable (IfEq n m o) => Peut-être (IfEq n m o) -> Peut-être o'. La stratégie générale consiste à utiliser des singletons. – user2407038