Récemment, je devais écrire la fonction suivante:
transposeF :: (Functor f, Functor g) => f (g a) -> g (f a)
4 Réponses :
Ce n'est pas possible en général, non. Définir f code> sur
const b code> et
g code> à
identité code>.
newtype Const b a = Const { getConst :: b }
newtype Identity a = Identity { runIdentity :: a }
Le Traversable code> Typeclass
fournit Les opérations SEQUENCE CODE> et
SEQUENCEA CODE>, qui fournissent les solutions les plus générales à votre problème, mais elles nécessitent des contraintes différentes:
sequence :: (Traversable t, Monad m) => t (m a) -> m (t a)
sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a)
Il n'est pas possible de le faire en utilisant des foncteurs simplement parce qu'il n'y a pas de moyen générique de déballer une valeur de fonctions: au lieu de cela, vous pouvez créer votre propre tyclass pour fournir une transposition générique La raison pour laquelle nous faisons transpose < / code> fonction comme suit: p>
applicatif code> une superclasse de
transposable code> est donc afin que nous puissions Utilisez sa méthode
pure code>. Toutes les instances de
applicatifs code> sont également des instances de
Foncteur code>. P> p>
En réalité, il existe une classe de type qui soutiendrait cela. Il n'est pas inclus dans la classe de type standard, mais les "foncteurs représentables" ont cette capacité.
Un foncteur représentatif est un fonctionnaire Nous pourrions représenter cela comme p> où en utilisant maintenant celui-ci, nous pouvons dériver p> en fait, nous pouvons aussi obtenir une instance d'applicatifs et de monad libres à partir de foncteurs représentables. J'ai détaillé comment vous pourriez faire cela dans un Publication du blog . p> p> F code> avec deux choses p>
A code> li>
f code> et
(->) a code> li>
ol>
TOHOM. dehom = dehom. tohom = id code>. Un exemple de foncteur représentable, p>
Le lien vers votre poteau de blog est cassé. Voici un lien de la machine de navigager qui fonctionne. web.archive.org/web/20160507044828/http://jozefg.bitbucket.o rg / ...
Il convient de noter que ce n'est pas nécessairement une opération symétrique-déplacement
F (GA) -> G (FA) code> pourrait être possible sans avoir
g (FA) -> F (GA) < / code>.
La classe que vous voulez est probablement distribution .