web-dev-qa-db-fra.com

Applications réelles des prépromorphismes zygohistomorphes

Oui, ceux-ci :

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

Oui, je sais que c'est une blague ( HHOS ). Je cherche un exemple du monde réel pour une valeur de piratage simple et enfin, mais non des moindres, pour l'ajouter au wiki en disant "C'est la façon idiomatique d'exprimer XYZ". Je mettrai une prime à ce sujet si vous n'arrivez pas à trouver une solution. Si vous êtes complètement perdu sur leur sujet, Edward a posté un courte explication sur reddit.

Les réponses éligibles doivent:

  1. faire quelque chose au moins à distance et théoriquement utile. Autrement dit, les réponses qui se réduisent à id sont sorties.

  2. utiliser toutes les fonctionnalités du schéma, sans passer de id, ou const, ou équivalent.

  3. pas aussi bien exprimable par un simple pli vanille ou autre, alors ne vous contentez pas d'implémenter product de façon sinueuse.

Des points bonus seront attribués à:

  • Problème ou algorithme bien connu

  • résolus, respectivement exprimés, d'une manière inhabituelle qui gagne

  • clarté et/ou performance

  • et/ou pirater la valeur

  • et/ou lulz, à peu près dans cet ordre, ainsi que

  • réponses de haut rang (oui démocratie)

Veuillez également noter réponse d'Edward ci-dessous. Quelle implémentation ZHPM vous utilisez est votre choix.

155
barsoap

Sharon Curtis et Shin-Cheng Mu ont une perle fonctionnelle utilisant des zygomorphismes pour trouver des segments maximaux denses (une généralisation des sommes maximales des segments). Les zygomorphismes sont apparemment une bonne solution pour les problèmes de fenêtres coulissantes une fois que vous y êtes habitué.

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

Je nommerais les auteurs pour un crédit supplémentaire car ils ont évité l'utilisation du foncteur Mu à virgule fixe.

52
stephen tetley

Remarque, la signature de ceux-ci a changé, car elle n'était pas suffisamment générale, et je l'ai incluse (comme une plaisanterie) dans mon schémas de récursivité package.

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 mise en œuvre a également été simplifiée.

zygoHistoPrepro f = gprepro (distZygoT f distHisto)

Et à partir de la nouvelle implémentation, il devrait être évident comment implémenter un prépromorphisme zygohistomorphique généralisé, en relâchant la contrainte que vous avez un (Base t)-Branching stream, en utilisant à la place distGHisto.

39
Edward KMETT