2014-07-22 6 views
13

Nel pacchetto recursion-schemes possiamo esprimere il fatto che un (rigorosamente positivo) algebrico tipo di datiPerché un tipo algebrico dovrebbe essere solo un'algebra iniziale (o viceversa)?

  1. ha un funtore firma, f
  2. è l'iniziale f -algebra e
  3. è finale f -coalgebra

per esempio, siamo in grado di farlo per [a] con il seguente codice

In particolare, per qualsiasi tipo in cui abbiamo (1), (2) e (3) dovremmo avere che (project, embed) testimoni di un isomorfismo.

Sono a conoscenza del fatto che i tipi di dati in generale (o almeno quelli strettamente positivi) sono sempre co/algebre finali/iniziali di qualche funzione di firma, infatti sono sempre entrambi.

Quindi la mia domanda è: perché avere Foldable e come classi separate? Quando un tipo di dati dovrebbe essere solo uno o l'altro?

Attualmente posso immaginare che questo potrebbe essere utile per i tipi di dati astratti che desiderano solo fornire un'interfaccia di piegatura o di apertura, ma ci sono anche altre volte?

+0

Dobbiamo necessariamente definire algebra e coalgebra reciproca per qualsiasi tipo? Potrebbe essere possibile che per qualche tipo si voglia definire un'algebra che costruisce i valori e una coalgebra per elaborarli (e non solo decostruirli 'dualmente')? – didierc

+2

Si potrebbe sicuramente, questo significherebbe che i tuoi dispieghi si dispiegano in un sottoinsieme di valori possibili e le pieghe "vedono" un sottoinsieme dei possibili dati - questo quasi certamente si verificherebbe in un tipo di dati astratto (altrimenti perché astratto?) . La mia lettura sui significati previsti di 'Foldable' /' Unfoldable' è che il functor 'Base' dovrebbe essere esattamente il funtore di firma del tipo e quindi sono reciproci. –

+1

Mi sembra che 'Foldable' e' Unfoldable' stiano per esporre i tipi di dati come algebre e coalgebre rispettivamente, non necessariamente iniziali o finali. (Questo è probabilmente anche ciò che stava dicendo @didierc.) –

risposta

5

Questa potrebbe non essere una risposta alla tua domanda, ma non è proprio vero che i tipi di dati Haskell strettamente positivi sono algebre iniziali. La ragione di ciò è che anche nel sottoinsieme totale di Haskell (che è quello su cui vogliamo lavorare quando ragioniamo!) Avete dati infiniti.

Ad esempio, la piega di una lista infinita è parziale.

+0

Non mantengo viva la tensione nella mia mente, ma hai ragione. Non sono sicuro del modo migliore per esprimerlo, però (e sarei felice di modificare la domanda con qualche suggerimento). Vorrei suggerire l'idea che il minimo punto fisso e il massimo punto fisso coincidano con Haskell, o almeno che non vi impedisca di far passare un generatore in una piega. Questo rompe l'universalità, ma non so come altro dirlo. –

Problemi correlati