Aplicações do mundo real de pré-promorfismos zigo-histomórficos

156

Sim, estes :

{-#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))

Sim, eu sei que eles são uma piada ( HHOS ). Estou procurando um exemplo do mundo real para um valor simples de hack e, por último, mas não menos importante, para adicioná-lo ao wiki dizendo "Esta é a maneira idiomática de expressar XYZ". I vai colocar uma recompensa por isso você deve deixar de chegar a uma solução. Se você está completamente perdido, Edward postou uma breve explicação no reddit.

As respostas elegíveis devem:

  1. faça algo pelo menos remotamente e teoricamente computacionalmente útil. Ou seja, respostas que reduzem a idestão fora.

  2. use todos os recursos do esquema, sem passagem de id, ou const ou equivalente.

  3. não seja igualmente bem expressável por uma simples dobra de baunilha ou algo assim; portanto, não apenas implemente de productmaneira sinuosa.

Pontos de bônus serão dados a:

  • Problema ou algoritmo conhecido

  • resolvidos, respectivamente expressos, de uma maneira incomum que ganha

  • clareza e / ou desempenho

  • e / ou valor de hack

  • e / ou lulz, aproximadamente nessa ordem, bem como

  • respostas de alto escalão (democracia yay)

Observe também a resposta de Edward abaixo. Qual implementação de ZHPM você usa é sua escolha.

sabão em barra
fonte
5
Se você tivesse incluído IOna sua pilha, poderíamos ter usado a famosa launchMisslesfunção do SimonPJ . Mas acho que o objetivo de toda essa bobagem abstrata super pura é evitar a possibilidade de tais coisas.
Yitz
6
Bem, apode ser qualquer coisa, portanto, sinta-se à vontade para construir um valor de IO que estrategicamente atire mísseis com base em uma avaliação dos dados de entrada.
barsoap
49
Eu cliquei nessa pergunta porque não tinha idéia do que diabos você está falando. +1 bom senhor, +1
Drew
7
Alguém que queira usar todos os componentes faria bem em escrever manualmente para o que uma recursão do pré-promorfo zigomistomórfico se expande e depois procurar problemas que precisem de todos esses padrões; loops imperativos tendem a fazer um rastreamento arbitrariamente complicado, portanto podem ser um bom lugar para procurar.
Edward Z. Yang
3
e mais importante - ele vai se misturar ?! (muito muito, não poderíamos resistir)
n00b

Respostas:

52

Sharon Curtis e Shin-Cheng Mu têm uma Pérola Funcional usando zigomorfismos para encontrar segmentos maximamente densos (uma generalização da soma máxima de segmentos). Aparentemente, os zigomorfismos são adequados para problemas de janelas deslizantes quando você está acostumado a eles.

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

Eu indicaria os autores para crédito extra, pois eles evitaram o uso do functor Mu de ponto fixo.

Stephen Tetley
fonte
Ao analisar, acho que vejo como eles usam o histo ao rastrear o DRSP (no mesmo sentido em que um simples foldrpode ver a lista que já foi construída), mas o prepro não é imediatamente aparente para mim. Você poderia elaborar? (e, se possível, dar curto código + doce que pode alinhavar até a página wiki?)
barsoap
3
O código está disponível em um link abaixo da errata na página de destino. A definição real do zigomorfismo está no arquivo Main.hs - é diferente da definição no artigo. É "apenas" um zigomorfismo, não um "pré-promorfismo zigo-histomórfico" - um zigomorfismo é a coisa mais próxima que eu já vi com o uso no mundo real. Embora existam lâminas por Jevgeni Kabanov usando histomorphisms para programação dinâmica: cs.ioc.ee/~tarmo/tday-viinistu/kabanov-slides.pdf
Stephen tetley
39

Observe que a assinatura deles mudou, porque era insuficientemente geral e eu a incluí (como uma piada) no meu pacote de esquemas de recursão .

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

A implementação também foi simplificada.

zygoHistoPrepro f = gprepro (distZygoT f distHisto)

E a partir da nova implementação, deve ser óbvio como implementar um pré-promorfismo zigo-histomórfico generalizado , relaxando a restrição de que você tem um (Base t)-Branchingfluxo, usando-o distGHisto.

Edward KMETT
fonte
2
Ah sim, bastante óbvio.
Ben Longo