6
votes

"Transposition" des foncteurs?

Récemment, je devais écrire la fonction suivante:

transposeF :: (Functor f, Functor g) => f (g a) -> g (f a)


2 commentaires

Il convient de noter que ce n'est pas nécessairement une opération symétrique-déplacement F (GA) -> G (FA) pourrait être possible sans avoir g (FA) -> F (GA) < / code>.


La classe que vous voulez est probablement distribution .


4 Réponses :


10
votes

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 }


0 commentaires

13
votes

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)


0 commentaires

0
votes

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: xxx

au lieu de cela, vous pouvez créer votre propre tyclass pour fournir une transposition générique transpose < / code> fonction comme suit: xxx

La raison pour laquelle nous faisons applicatif une superclasse de transposable est donc afin que nous puissions Utilisez sa méthode pure . Toutes les instances de applicatifs sont également des instances de Foncteur .


0 commentaires

8
votes

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 F avec deux choses

  1. un type A
  2. Un isomorphisme entre f et (->) a

    Nous pourrions représenter cela comme xxx

    TOHOM. dehom = dehom. tohom = id . Un exemple de foncteur représentable, xxx

    en utilisant maintenant celui-ci, nous pouvons dériver xxx

    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 .


1 commentaires

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 / ...