2010-07-17 13 views
29

Sono un po 'confuso e ho bisogno di qualcuno che mi renda conto. Consente di delineare la mia comprensione attuale:Tutti i funtori funzionali Haskell sono?

Dove E è un endofunctor, e A è qualche categoria:

E : A -> A. 

Dal momento che tutti i tipi e morfismi a Haskell sono nella categoria Hask, non è un qualsiasi functor in Haskell anche un endofunctor? F : Hask -> Hask.

Ho la sensazione che io abbia torto, e in qualche modo semplificando questo, e mi piacerebbe che qualcuno mi dicesse che idiota sono. Grazie.

+0

C'è qualche parola mancante prima di "Dove' E' ... "? – kennytm

risposta

33

Si consiglia di chiarire se si sta chiedendo di "functors in Haskell", o Functor s. Non è sempre chiaro quale categoria viene assunta quando i termini della Teoria delle Categorie sono usati in Haskell.

Ma sì, l'ipotesi di default è Hask, che è considerata la categoria dei tipi Haskell con funzioni come morfismi. In tal caso, un endofunctor F su Hask mapperebbe qualsiasi tipo A a un tipo F (A) e qualsiasi funzione f tra due tipi A e B a una funzione F (f) tra alcuni tipi F (A) e F (B).

Se poi limitiamo ai soli endofunctors che mappano qualsiasi tipo a a un tipo (f a) dove f è un tipo di costruzione con gentile * -> *, allora è possibile descrivere la mappa associata per funzioni come una funzione di ordine superiore di tipo (a -> b) -> (f a -> f b) , che è ovviamente la classe di caratteri chiamata Functor.

Tuttavia, si può facilmente immaginare endofunctors beneducati su Hask che non può essere scritto (direttamente) come esempio di Functor, ad esempio un functor mappatura di un tipo a a Either a t. E mentre non c'è ovviamente molto senso in un funtore dalla Hask di qualche altra categoria del tutto, è ragionevole considerare un (controvariante) funtore da Hask a Haskop.

Oltre a ciò, le istanze di Functor necessariamente mappano dall'intera categoria Hask su un sottoinsieme di esso che, quindi, forma anche una categoria. Ma è anche ragionevole parlare dei funtori tra sottoinsiemi di Hask. Ad esempio, si consideri un funtore che invia i tipi Maybe a a [a].

È possibile consultare lo category-extras package, che fornisce alcune strutture ispirate alla teoria di categorie incorporate all'interno di Hask invece di assumerne la totalità.

+7

Questo è un po 'tangente, ma volevo verificare la mia comprensione: una mappatura da Maybe a a [a] può essere pensata in vari modi: (a) Un functor, dove Maybe e [] formano sub -categorie di Hask. (b) Una trasformazione naturale, dove Forse e [] formano endofunzionisti su Hask. (c) Una famiglia di morfismi nella categoria Hask, da Maybe a a [a] forall a in Obj (Hask). È tutto corretto? –

+0

L'addendum: (a) e (b) sono ovviamente subordinati alla mappatura che soddisfa rispettivamente le leggi dei funtori e delle trasformazioni naturali. È giusto dire che se le leggi del functor sono soddisfatte per (a), allora la stessa mappatura può essere vista come (b) e viceversa? –

+0

@ Tom: io ... penso di si? Sembra giusto per me. In effetti, penso che qualsiasi funzione con il tipo 'forall a. Forse a -> [a] '* deve * essere una trasformazione naturale. 'maybeToList' in Data.Maybe, ad esempio, è (o descrive sufficientemente) tutto ciò che hai citato, credo, ma la mia comprensione della Teoria delle Categorie è abbastanza limitata, quindi non prenderla come Vangelo ... –

7

A possibilmente rilevante (o per lo meno interessante) discussione specificamente per quanto riguarda monadi si trova nel documento "Monadi non devono essere endofunctors":

http://www.cs.nott.ac.uk/~txa/publ/Relative_Monads.pdf

+2

Per quello che vale, le monade nel senso della teoria di categoria standard sono effettivamente definite come endofuntor, mentre la classe di tipo "Monad" è un concetto più ristretto, sia nello stesso modo in cui descrivo per "Functor", sia con alcune complicazioni aggiuntive derivanti da la struttura molto invasiva chiusa da cartesiano di ** Hask **. –

13

Anche se in ultima analisi, di manipolare Hask, ci sono un molte altre categorie che possono essere costruiti su Hask, che può essere significativa per il problema a portata di mano:

  • Hask^op, che è Hask con tutte le frecce invertite
  • Hask * Hask, funtori su di esso sono bifunctors
  • categorie Comma, vale a dire. oggetti sono morfismi ad un oggetto fisso a, morfismi sono triangoli commutativi
  • categorie functor, morfismi sono trasformazioni naturali Categorie
  • Algebra
  • Monoidal categorie
  • Kleisli Categorie
  • ...

prendi una copia delle categorie di Mac Lane per il matematico del lavoro per avere definizioni e provare a trovare da solo il problema che risolvono in Haskell. Soprattutto soffocano i functors aggiunti (che sono oggetti iniziali/terminali nella categoria giusta) e la loro relazione con le monadi.

Vedrai che anche se v'è una grande categoria (Hask, o "oggetti sollevato dal Hask con le frecce destra/prodotti/...", forse, che incapsula le scelte linguistiche di Haskell come la non-rigore e pigrizia), le categorie derivate corrette sono espressive.

+0

Grazie mille. Potrei controllare quel libro. –

+9

Tieni presente che devi leggere questo libro con un _purpose_ (programmazione funzionale, o geometria algebrica o qualsiasi altra cosa), perché è piuttosto conciso riguardo agli esempi, e in qualche modo sei tenuto a fornire _yours_. Questo lo rende un libro incredibilmente flessibile, usato da scienziati di orizzonti molto diversi. –