Реальные приложения зигогистоморфных препреморфизмов
Да, эти:
{-#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
.