Applicazioni del mondo reale di prepromorfismi zygoistomorfi


156

Sì, questi :

{-#LANGUAGE TypeOperators, RankNTypes #-}
import Control.Morphism.Zygo
import Control.Morphism.Prepro
import Control.Morphism.Histo
import Control.Functor.Algebra
import Control.Functor.Extras
import Control.Functor.Fix
import Control.Comonad.Cofree

zygohistomorphic_prepromorphism 
  :: Functor f
  => Algebra f b
  -> GAlgebra f (ZygoT (Cofree f) b) a 
  -> (f :~> f) 
  -> FixF f 
  -> a
zygohistomorphic_prepromorphism f 
  = g_prepro (distZygoT (liftAlgebra f) (distHisto id))

Sì, so che sono uno scherzo ( HHOS ). Sto cercando un esempio del mondo reale per un semplice valore di hacking e, ultimo ma non meno importante, aggiungerlo al wiki dicendo "Questo è il modo idiomatico di esprimere XYZ". Io sarò messo una taglia su questo si dovrebbe riuscire a trovare una soluzione. Se ti sei completamente perso su ciò di cui parlano, Edward ha pubblicato una breve spiegazione su reddit.

Le risposte idonee devono:

  1. fare qualcosa almeno in remoto e teoricamente utile dal punto di vista computazionale. Cioè, le risposte che riducono a idsono fuori.

  2. usa tutte le funzionalità dello schema, nessun passaggio di id, const o equivalente.

  3. non essere ugualmente bene esprimibile con una semplice piega alla vaniglia o simile, quindi non limitarti a implementarlo productin modo tortuoso.

I punti bonus saranno assegnati a:

  • Problema o algoritmo noto

  • risolto, rispettivamente espresso, in un modo insolito che guadagna

  • chiarezza e / o prestazione

  • e / o valore di hacking

  • e / o lulz, all'incirca in quell'ordine, nonché

  • risposte di alto livello (yay democrazia)

Nota anche la risposta di Edward qui sotto. Quale implementazione di ZHPM usi è la tua scelta.


5
Se avessi incluso IOnel tuo stack, avremmo potuto usare la famosa launchMisslesfunzione di SimonPJ . Ma suppongo che il punto centrale di tutte queste assurdità astratte purissime sia evitare la possibilità di tali cose.
Yitz,

6
Bene, apuò essere qualsiasi cosa, quindi sentiti libero di costruire un valore IO che lancia strategicamente missili sulla base di una valutazione dei tuoi dati di input.
barsoap,

49
Ho cliccato su questa domanda perché non avevo idea di che diavolo stai parlando. +1 bravo signore, +1
Estratto il

7
Qualcuno che sta cercando di utilizzare tutti i componenti farebbe bene a scrivere manualmente ciò a cui si espande una ricorsione di prepromorfismo zygoistomorfo, e quindi cercare i problemi che richiedono tutti questi schemi; i loop imperativi tendono a eseguire tracciamenti arbitrariamente complicati, quindi potrebbero essere un buon posto in cui guardare.
Edward Z. Yang,

3
e ancora più importante: si fonderà ?! (molto dispiaciuto, non ho potuto resistere)
n00b

Risposte:


52

Sharon Curtis e Shin-Cheng Mu hanno una Perla Funzionale che utilizza zigomorfismi per trovare segmenti massimamente densi (una generalizzazione delle somme massime di segmenti). Gli zigomorfismi sembrano adattarsi bene ai problemi delle finestre scorrevoli una volta che vi siete abituati.

http://www.iis.sinica.edu.tw/~scm/2010/functional-pearl-maximally-dense-segments/

Nominerei gli autori per un credito extra in quanto hanno evitato l'uso del Mu-funzione a virgola fissa.


Dalla scrematura, penso di vedere come usano histo durante il monitoraggio della DRSP (nello stesso senso in cui un semplice foldrpuò guardare l'elenco che ha già costruito), ma la prepro non mi è immediatamente evidente. Potresti elaborare? (e, se possibile, dare un codice breve + dolce che possiamo
aggiungere

3
Il codice è disponibile da un link sotto gli errata nella pagina di destinazione. La definizione effettiva dello zigomorfismo è nel file Main.hs - è diversa dalla definizione nel documento. È "solo" uno zigomorfismo non uno "prepromorfismo ziggoistomorfo" - uno zigomorfismo è la cosa più vicina che ho visto con un uso nel mondo reale. Anche se ci sono diapositive di Jevgeni Kabanov che usano istomorfismi per la programmazione dinamica: cs.ioc.ee/~tarmo/tday-viinistu/kabanov-slides.pdf
stephen tetley,

39

Nota, la firma di questi è cambiata, perché non era sufficientemente generale, e l'ho inclusa (come uno scherzo) nel mio pacchetto di schemi di ricorsione .

zygoHistoPrepro 
  :: (Unfoldable t, Foldable t) 
  => (Base t b -> b) 
  -> (forall c. Base t c -> Base t c) 
  -> (Base t (EnvT b (Stream (Base t)) a) -> a) 
  -> t
  -> a

Anche l'implementazione è stata semplificata.

zygoHistoPrepro f = gprepro (distZygoT f distHisto)

E dalla nuova implementazione dovrebbe essere ovvio come implementare un prepromorfismo zygoistomorfo generalizzato, allentando il vincolo che si ha un (Base t)-Branchingflusso, attraverso l'uso di distGHistoinvece.


2
Ah sì abbastanza ovvio.
Ben Longo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.