Реальные приложения зигогистоморфных препреморфизмов

Да, эти:

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

Да, я знаю, что они (HHOS) шутка. Я ищу пример реального мира для простого взлома и последнее, но не в последнюю очередь, добавить его в вики, в которой говорится: "Это идиоматический способ выражения XYZ". Я поставлю щедрость на это, если вы не придумаете решение. Если вы полностью проиграли, о чем они говорят, Эдвард опубликовал короткое объяснение в reddit.

Подходящие ответы должны:

  • делать что-то хотя бы удаленно и теоретически полезно для вычислений. То есть ответы, которые сводятся к id, отсутствуют.

  • используйте все функции схемы, не проходящие в id, или const, или эквивалентные.

  • не одинаково хорошо выражаться простой, ванильной складкой или таковой, поэтому не просто реализуйте product меандрирующим способом.

Бонусные баллы будут присвоены:

  • Известная проблема или алгоритм

  • решил, соответственно выраженный, необычным способом, который получает

  • Ясность и/или производительность

  • и/или взломать значение

  • и/или lulz, примерно в этом порядке, а также

  • высокопоставленные ответы (yay-демократия)

Также обратите внимание на ответ Эдварда ниже. Какая реализация ZHPM вы используете, это ваш выбор.

Ответ 1

Шарон Кертис и Шин-Ченг Му имеют функциональную жемчужину, используя зигоморфизмы для нахождения максимально плотных сегментов (обобщение максимальных сумм сегмента). Zygomorphisms, по-видимому, хорошо подходят для решения проблем с окнами, когда вы привыкли к ним.

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

Я бы назначил авторов для дополнительного кредита, поскольку они избегали использования функтора Mu с фиксированной точкой.

Ответ 2

Обратите внимание, что их подпись изменилась, потому что она была недостаточно общей, и я включил ее (как шутка) в 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

Реализация также была упрощена.

zygoHistoPrepro f = gprepro (distZygoT f distHisto)

И из новой реализации должно быть очевидно, как реализовать обобщенный zygohistomorphic prepromorphism, ослабляя ограничение, которое у вас есть поток (Base t)-Branching, вместо использования distGHisto.