9

co jest ogólnym terminem dla funktora o strukturze przypominającej promote funkcji QuickCheck'S, czyli funkcji postaci:Jaki jest ogólny przypadek funkcji promującej QuickCheck?

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

(to odwrotność flip $ fmap (flip ($)) :: f (a -> b) -> (a -> f b)). Czy są jakieś funktory z taką operacją, inne niż (->) r i Id? (Jestem pewien, że musi być). Googling "quickcheck promot" tylko pojawił się dokumentacja QuickCheck, która nie daje promote w bardziej ogólnym kontekście AFAICS; wyszukiwanie SO dla "promocji quickcheck" nie daje wyników.

+0

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

+0

Pozwól mi zobaczyć. Zastępując w typie 'sequenceA', otrzymalibyśmy' t = (->) a' i 'f = f'. Więc jeśli '(->) a' miał instancję' Traversalable', ta funkcja istniałaby dla wszystkich 'a'. Myślę, że 'Traversable ((->) a)' wymaga '(Bounded a, Enum a)' lub równoważnego. –

+1

Co to jest warte, rodzina pakietów [wszechświat] (http://hackage.haskell.org/package/universe) zapewnia wymaganą instancję 'Traversable' (http://hackage.haskell.org/package/universe) -reverse-instances-1.0/docs/src/Data-Universe-Instances-Traversable.html). –

Odpowiedz

1

tej pory znalazłem te sposoby konstruowania f z promote morfizmu:

  • f = Identity
  • jeśli f i g oba mają promote następnie funktor para h t = (f t, g t) robi również
  • jeśli F i G oba mają promote, a następnie kompozycja h t = f (g t) ma także
  • , jeśli f ma właściwość promote, a g to y contrafunctor następnie funktor h t = g t -> f t ma promote nieruchomość

Ostatni nieruchomość może być uogólnione na profunctors g, ale wtedy f będzie jedynie profunctor, więc to chyba nie bardzo przydatne, chyba że wymagają jedynie profunctors.

Teraz, stosując te cztery konstrukcje, możemy znaleźć wiele przykładów funktorów f dla których promote istnieje:

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 

Należy również pamiętać, że nieruchomość promote oznacza, że ​​f jest skierowany.

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

Zasadniczo to samo pytanie: 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 

Zważywszy, że Monada jest bardziej wydajny interfejs niż aplikacyjnych, to mówi nam, że a -> f b można zrobić coś więcej niż f (a -> b). Mówi nam to, że funkcja typu (a -> f b) -> f (a -> b) nie może być wstrzykiwaczem. Domena jest większa niż kodomain, w sposób ręczny. Oznacza to, że nie ma możliwości zachowania zachowania funkcji. Po prostu nie działa na generycznych funktorach.

Można oczywiście scharakteryzować funktory, w których ta operacja jest iniekcyjna. Identity i (->) a są z pewnością przykładami. Mogę się założyć, że jest więcej przykładów, ale nic natychmiast nie wyskakuje na mnie.

1

Data.Distributive ma

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

Zmiana nazwy zmiennych, masz

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

Korzystanie nieznacznie nieprawidłową składnię dla jasności

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

(c ->) jest Functor, więc rodzaj promote jest szczególnym przypadkiem rodzaju distribute. Zatem każdy funktor Distributive obsługuje twój promote. Nie wiem, czy którekolwiek wsparcie promote, ale nie Distributive.

+2

"Dystrybucja" jest silniejsza niż "promocja". Każdy "Distributive" functor 'g' jest reprezentowalny: to znaczy istnieje stały typ' b' taki, że 'g t = b -> t'. Jednak funktory takie jak 'g t = (t -> a) -> t' mają' promot', ale nie są reprezentowalne, a zatem nie mogą być "Distributive". Generalnie, funktor 'g' zdefiniowany jako' g t = c t -> h t' ma 'promot', jeśli' c' jest dowolnym kontrrokretorem, a 'h' ma' promot. Ta konstrukcja może definiować "dystrybucję" tylko wtedy, gdy "c" jest stałym (przeciwnym) funktorem. – winitzki

Powiązane problemy