Czy wszystkie funktory Haskella są endofunktorami?
Jestem trochę zdezorientowana i potrzebuję kogoś, kto mnie wyprostuje. Pozwala zarysować moje obecne zrozumienie:
Gdzie E
jest endofunktorem, a {[2] } jest jakąś kategorią:
E : A -> A.
Ponieważ wszystkie typy i morfizmy w Haskell są w Hask
kategorii, czy nie jest functorW Haskell również endofunctor? F : Hask -> Hask
.
3 answers
Możesz chcieć wyjaśnić, czy pytasz o "funktory w Haskell", czy Functor
s. nie zawsze jest jasne, jaką kategorię przyjmuje się, gdy pojęcia teorii kategorii są używane w Haskell.
Ale tak, domyślnym założeniem jest Hask , który jest brany za kategorię typów Haskella z funkcjami jako morfizmami. W takim przypadku endofunktor F na Hask odwzorowywałby dowolny typ A na typ F(A) i dowolną funkcję F pomiędzy dwoma typami a i B na funkcję F (f) pomiędzy niektórymi typami F (A) i F (B).
Jeśli ograniczamy się tylko do tych endofunktorów, które mapują dowolny typ a
do typu (f a)
Gdzie f
jest konstruktorem typu z typem * -> *
, to możemy opisać powiązaną mapę funkcji jako funkcję wyższego rzędu z typem (a -> b) -> (f a -> f b)
, która jest oczywiście klasą typu o nazwie Functor
.
Można jednak łatwo wyobrazić sobie dobrze zachowujące się endofunkcje na Hask, które nie mogą być zapisane (bezpośrednio) jako instancja Functor
, np. funkcja odwzorowująca typ a
na Either a t
. I choć oczywiście nie ma większego sensu w funktorze od Hask do jakiejś innej kategorii, rozsądne jest rozważenie (kontrawariantnego) funktora od Hask do Haskop .
Poza tym, instancje Functor
muszą mapować z całej kategorii Hask na pewien jej podzbiór, który zatem również tworzy kategorię. Ale warto też mówić o funkcjach pomiędzy podzbiorami Hask. Na przykład, rozważmy funktor, który wysyła typy Maybe a
do [a]
.
Możesz chcieć zapoznać się z category-extras
pakiet , który dostarcza pewne struktury inspirowane teorią kategorii osadzone w Hask zamiast zakładać całość.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-17 22:13:25
Nawet jeśli ostatecznie manipulujesz Hask
, istnieje wiele innych kategorii, na których można zbudować Hask
, które mogą mieć znaczenie dla danego problemu:
-
Hask
^op, czyliHask
ze wszystkimi strzałkami odwróconymi -
Hask * Hask
, funktory na niej to bifunktory - kategorie przecinków, czyli obiekty są morfizmami do stałego obiektu
a
, morfizmy są trójkątami przemiennymi - kategorie funkcyjne, morfizmy są naturalne transformacje
- kategorie algebry
- kategorie Monoidalne
- Kleisli kategorie
- ...
Pobierz kopię kategorii Mac Lane dla pracującego Matematyka , aby mieć definicje, i spróbuj znaleźć samodzielnie problem, który rozwiązują w Haskell. Szczególnie dotyczy to funktorów adjoint (które są obiektami początkowymi/końcowymi w odpowiedniej kategorii) oraz ich relacji z monadami.
Zobaczysz, że nawet jeśli jest jeden duży category (Hask
, a może " Podnoszone obiekty z Hask
z prawej strzałki / products/...", która zawiera w sobie wybory językowe Haskella, takie jak np. nieścisłość i lenistwo), właściwe kategorie pochodne są wyraziste.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-19 15:10:04
Prawdopodobnie istotna (a przynajmniej interesująca) dyskusja dotycząca monad znajduje się w artykule "monady nie muszą być endofunktorami":
Http://www.cs.nott.ac.uk/ ~ txa / publ / Relative_Monads. pdf
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-17 22:30:33