Question

Est-il possible en Haskell pour appliquer la fonction de flèche constructeur de type (->) pour que son latéral droit type (par exemple:(-> a)) pour obtenir un constructeur de type de type * -> *?

Était-ce utile?

La solution

Non, il est actuellement impossible.Il y a certaines limites à Haskell type de système qui lui permettent d'être utile et pratique pour la plupart des cas, et c'est un de ces limitations.Votre meilleure alternative est d'utiliser un newtype.

newtype FuncFlip r a = FuncFlip { unFuncFlip :: a -> r }

Newtypes sont simplement des étiquettes à l'aide du compilateur de savoir comment typecheck et effectuer type-dirigé l'expédition (typeclasses) correctement.Sans doute que vous vouliez retourner les arguments de type à fournir certains typeclass instance.Cela signifie simplement que chaque fois que vous voulez faire usage de l'typeclass fonctions, vous avez pour décorer toutes les entrées spécifiques, avec FuncFlip, et undecorate spécifiques sorties avec des unFuncFlip.C'est un peu plus détaillé que souhaité, mais il n'est en fait pas si mal que ça, parce qu'il oblige explicitement d'identifier l'instance de la typeclass vous souhaitez utiliser.

Vous pouvez créer une instance de Newtype pour ce qui peut ou pas être pratique pour vous.

instance Newtype (FuncFlip r a) (a -> r) where
  pack = FuncFlip
  unpack = unFuncFlip

Pour en savoir plus: Y sont "au niveau du type combinatos?"

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top