Applications réelles des prépromorphismes zygohistomorphes

156

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 suis à la recherche d'un exemple concret de valeur de hack simple et enfin, mais non des moindres, de l'ajouter au wiki en disant "C'est la manière idiomatique d'exprimer XYZ". Je vais mettre une prime sur ce si vous négligez de trouver une solution. Si vous êtes complètement perdu sur ce dont ils parlent, Edward a publié une courte explication sur reddit.

Les réponses éligibles doivent:

  1. faire quelque chose au moins à distance et théoriquement utile en termes de calcul. Autrement dit, les réponses qui se réduisent à idsont sorties.

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

  3. pas tout aussi bien exprimable par un simple pli vanille ou autre, alors ne vous contentez pas de mettre producten œuvre de manière 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 valeur de piratage

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

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

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

savon en barre
la source
5
Si vous l'aviez inclus IOdans votre pile, nous aurions pu utiliser la célèbre launchMisslesfonction de SimonPJ . Mais je suppose que le but de toutes ces absurdités abstraites super-pures est d'éviter la possibilité de telles choses.
Yitz
6
Eh bien, cela apeut être n'importe quoi, alors n'hésitez pas à construire une valeur IO qui lance stratégiquement des missiles en fonction d'une évaluation de vos données d'entrée.
barsoap
49
J'ai cliqué sur cette question parce que je ne savais pas de quoi vous parlez. +1 bon monsieur, +1
Drew
7
Quelqu'un qui cherche à utiliser tous les composants ferait bien d'écrire manuellement ce à quoi une récursivité prépromorphique zygohistomorphique se développe, puis de rechercher les problèmes qui nécessitent tous ces modèles; les boucles impératives ont tendance à effectuer un suivi arbitrairement compliqué, elles peuvent donc être un bon endroit pour regarder.
Edward Z. Yang
3
et plus important - Sera-t-il mélangé?! (très désolé, je n'ai pas pu résister)
n00b

Réponses:

52

Sharon Curtis et Shin-Cheng Mu ont une perle fonctionnelle utilisant des zygomorphismes pour trouver des segments denses au maximum (une généralisation des sommes maximales de segments). Les zygomorphismes sont apparemment un bon choix 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.

Stephen Tetley
la source
De l'écrémage, je pense voir comment ils utilisent histo lors du suivi du DRSP (dans le même sens qu'un simple foldrpeut regarder la liste déjà construite), mais le prépro ne m'est pas immédiatement apparent. Pourriez-vous élaborer? (et, si possible, donnez un code court + doux que nous pouvons clouer sur la page wiki?)
barsoap
3
Le code est disponible à partir d'un lien sous les errata sur la page de destination. La définition réelle du zygomorphisme est dans le fichier Main.hs - c'est différent de la définition dans l'article. C'est "juste" un zygomorphisme pas un "prépromorphisme zygohistomorphique" - un zygomorphisme est la chose la plus proche que j'ai vue avec une utilisation dans le monde réel. Bien qu'il existe des diapositives de Jevgeni Kabanov utilisant des histomorphismes pour la programmation dynamique: cs.ioc.ee/~tarmo/tday-viinistu/kabanov-slides.pdf
stephen tetley
39

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

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)-Branchingflux, en utilisant à la distGHistoplace.

Edward KMETT
la source
2
Ah oui assez évident.
Ben Longo