2011-02-20 15 views
150

Sí, these ones:aplicaciones del mundo real de prepromorphisms zygohistomorphic

{-#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í, ya sé que son una (HHOS) broma. Estoy buscando un ejemplo del mundo real para el valor de pirateo simple y, por último, pero no menos importante, para agregarlo al wiki diciendo "Esta es la forma idiomática de expresar XYZ". I pondré una recompensa por esto si no se llega a una solución. Si estás completamente perdido en lo que tratan, Edward publicó un short explanation en reddit.

Respuestas elegibles deben:

  1. hacer algo al menos de forma remota y, en teoría computacional útil. Es decir, las respuestas que se reducen a id están desactivadas.

  2. utilizan todas las características del esquema, no se transfiere de id o const o equivalente.

  3. no se pueden expresar de la misma manera con un simple plegado de vainilla o similar, así que no implemente product de forma serpenteante.

puntos de bonificación se dan a:

  • problema o algoritmo bien conocido

  • resuelto, expresado, respectivamente, de una manera inusual que gana

  • claridad y/o rendimiento

  • y/O piratear valor

  • y/o lulz, más o menos en ese orden, así como

  • respuestas de alto rango (democracia yay)

Tenga en cuenta también Edward's answer a continuación. Qué implementación de ZHPM usa es su elección.

+4

Si hubiera incluido 'IO' en su pila, podríamos haber usado la famosa función' launchMissles' de SimonPJ. Pero creo que el objetivo de todas esas tonterías abstractas superpuras es evitar la posibilidad de tales cosas. – Yitz

+4

Bueno, 'a' puede ser cualquier cosa, así que siéntete libre de construir un valor IO que estratégicamente lanza misiles basándose en una evaluación de tus datos de entrada. – barsoap

+47

Hice clic en esta pregunta porque no tenía ni idea de qué demonios estás hablando. +1 buen señor, +1 – Drew

Respuesta

38

Nota, la firma de estos ha cambiado, porque no era lo suficientemente general, y lo incluí (como una broma) en mi paquete recursion-schemes.

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 

La implementación también se ha simplificado.

zygoHistoPrepro f = gprepro (distZygoT f distHisto) 

Y a partir de la nueva aplicación debería ser obvio cómo implementar un prepromorphism zygohistomorphic generalizada, mediante la relajación de la restricción de que usted tiene una corriente (Base t)-Branching, mediante el uso de distGHisto lugar.

51

Sharon Curtis y Shin-Cheng Mu tienen una Perla funcional que utiliza zigomorfismos para encontrar segmentos de máxima densidad (una generalización de las sumas de los segmentos máximos). Los cigomorfismos son aparentemente una buena opción para los problemas de ventana deslizante una vez que esté acostumbrado a ellos.

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

Me propongo a los autores para el crédito adicional, ya que han evitado el uso del punto fijo Mu funtor.

+0

De skimming, creo que veo cómo usan histo al rastrear el DRSP (en el mismo sentido que un simple 'foldr' puede mirar la lista que ya construyó), pero el prepro no es inmediatamente aparente para mí. ¿Podrías elaborar? (y, si es posible, dar un código corto + dulce, podemos insertarlo en la página wiki) – barsoap

+3

El código está disponible desde un enlace debajo de la errata en la página de destino. La definición real del zigomorphism está en el archivo Main.hs - es diferente a la definición en el papel. Es "solo" un cigomorfismo, no un "prepromorfismo zygohistomorphic" - un cigomorfismo es lo más parecido que he visto a un uso en el mundo real. Aunque hay diapositivas de Jevgeni Kabanov usando histomorfismos para la programación dinámica: http://www.cs.ioc.ee/~tarmo/tday-viinistu/kabanov-slides.pdf –

Cuestiones relacionadas