9

Qual è il termine generico per un funtore con una struttura simile funzione promote di QuickCheck, cioè una funzione della forma:Qual è il caso generale della funzione di promozione di QuickCheck?

promote :: (a -> f b) -> f (a -> b) 

(questo è l'inverso del flip $ fmap (flip ($)) :: f (a -> b) -> (a -> f b)). Esistono persino dei funtori con questa operazione, ad eccezione di (->) r e Id? (Sono sicuro che ci deve essere). Googling 'quickcheck promote' ha solo alzato la documentazione QuickCheck, che non fornisce promote in un contesto più generale AFAICS; cercare SO per 'quickcheck promote' non produce risultati.

+0

È ['sequenceA'] (http://hackage.haskell.org/package/base-4.7.0.1/docs/Data-Traversable.html#v:sequenceA) rilevante? –

+0

Fammi vedere. Sostituendo il tipo di 'sequenzaA', otterremmo' t = (->) a' e 'f = f'. Quindi se '(->) a' aveva un'istanza 'Traversable', questa funzione esisterebbe per tutti' a'. Penso che 'Traversable ((->) a)' richieda '(Bounded a, Enum a)' o l'equivalente, comunque. –

+1

Per quello che vale, la famiglia di pacchetti [universo] (http://hackage.haskell.org/package/universe) fornisce [l'istanza necessaria di 'Traversable'] (http://hackage.haskell.org/package/universe -Inversa-casi-1.0/docs/src/Data-universo istanze-Traversable.html). –

risposta

1

Finora ho trovato questi modi di costruzione di un f con il promote morfismo:

  • f = Identity
  • se f e g entrambi hanno promote poi la coppia funtore h t = (f t, g t) fa anche
  • se F e G entrambi hanno promote quindi la composizione h t = f (g t) fa anche
  • se f ha la proprietà promote e g è un y contrafunctor poi il funtore h t = g t -> f t ha la proprietà promote

L'ultima proprietà può essere generalizzato a profunctors g, ma allora f sarà semplicemente un profunctor, quindi probabilmente non è molto utile, a meno che non si richiedono solo profunctors.

Ora, usando questi quattro costruzioni, possiamo trovare molti esempi di funtori f per i quali esiste promote:

f t = (t,t) 

f t = (t, b -> t) 

f t = (t -> a) -> t 

f t = ((t,t) -> b) -> (t,t,t) 

f t = ((t, t, c -> t, (t -> b) -> t) -> a) -> t 

Si noti inoltre che la proprietà promote implica che f è appuntita.

point :: t -> f t 
point x = fmap (const x) (promote id) 

Essenzialmente la stessa domanda: Is this property of a functor stronger than a monad?

5
(<*>) :: Applicative f => f (a -> b) -> f a -> f b 
(=<<) :: Monad m => (a -> m b) -> m a -> m b 

Dato che la Monade è più potente di un'interfaccia applicativa, questo ci dicono che a -> f b possono fare più cose di quanto f (a -> b). Questo ci dice che una funzione di tipo (a -> f b) -> f (a -> b) non può essere injective. Il dominio è più grande del codominio, in un modo di handwavey. Ciò significa che non è possibile preservare il comportamento della funzione. Semplicemente non funziona tra i generici.

È possibile, naturalmente, caratterizzare i funtori in cui tale operazione è iniettiva. Identity e (->) a sono certamente esempi. Sono disposto a scommettere che ci sono altri esempi, ma niente mi salta immediatamente.

1

Data.Distributive ha

class Functor g => Distributive g where 
    distribute :: Functor f => f (g a) -> g (f a) 
    -- other non-critical methods 

Rinominare le variabili, si ottiene

promote :: (c -> g a) -> g (c -> a) 

Uso della sintassi un po 'non valido per la chiarezza,

012.
promote :: ((c ->) (g a)) -> g ((c ->) a) 

(c ->) è un Functor, quindi il tipo di promote è un caso particolare del tipo di distribute. Pertanto, ogni Distributive functor supporta il tuo promote. Non so se alcun supporto promote ma non Distributive.

+2

'Distributivo' è strettamente più forte di' promote'. Ogni '' g' 'distributivo' è rappresentabile: cioè esiste un tipo costante 'b' tale che' g t = b -> t '. Tuttavia, i funtori come 'g t = (t -> a) -> t' hanno' promote' ma non sono rappresentabili e quindi non sono 'Distributive'. Più in generale, un functor 'g' definito come' g t = c t -> h t' ha 'promote' se' c' è un qualsiasi contrafunctor e 'h' ha' promote. Questa costruzione può definire un 'Distribuibile' solo se' c' è un costante (contra) funtore. – winitzki

Problemi correlati