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

156

Да, эти :

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

Правомочные Ответы должны:

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

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

  3. не одинаково хорошо быть выраженным простой, ванильной складкой или чем-то подобным, так что не просто реализуйте productизвилистым способом.

Бонусные баллы будут начислены:

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

  • решается, соответственно выражается, необычным образом, что выигрывает

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

  • и / или ценность хака

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

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

Пожалуйста, обратите внимание на ответ Эдварда ниже. Какую реализацию ZHPM вы используете - ваш выбор.

barsoap
источник
5
Если бы вы включили IOв свой стек, мы могли бы использовать знаменитую launchMisslesфункцию SimonPJ . Но я предполагаю, что весь смысл этой сверхчистой абстрактной чепухи состоит в том, чтобы избежать возможности подобных вещей.
Иц
6
Ну, aможет быть что угодно, поэтому не стесняйтесь построить значение IO, которое стратегически запускает ракеты на основе оценки ваших входных данных.
barsoap
49
Я нажал на этот вопрос, потому что понятия не имел, о чем, черт возьми, ты говоришь. +1 хорошо, сэр, +1
Дрю
7
Кто-то, желающий использовать все компоненты, должен был бы написать вручную, на что распространяется рекурсия зигогистоморфного препроморфизма, а затем искать проблемы, для которых нужны все эти шаблоны; императивные циклы, как правило, выполняют произвольно сложное отслеживание, поэтому они могут быть хорошим местом для поиска.
Эдвард З. Ян
3
и что более важно - это будет смешиваться ?! (очень жаль, не мог сопротивляться)
n00b

Ответы:

52

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

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

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

Стивен Тетли
источник
Из скимминга я думаю, что вижу, как они используют гисто при отслеживании DRSP (в том же смысле, что простой foldrможет посмотреть на список, который он уже создал), но препро не сразу для меня очевиден. Не могли бы вы уточнить? (и, если возможно, дайте короткий + сладкий код, который мы можем прикрепить на вики-странице?)
barsoap
3
Код доступен по ссылке под опечатками на целевой странице. Фактическое определение зигоморфизма находится в файле Main.hs - он отличается от определения в статье. Это «просто» зигоморфизм, а не «зигогистоморфный препроморфизм» - зигоморфизм - это самая близкая вещь, которую я видел в реальном мире. Хотя есть слайды Евгения Кабанова, использующие гистоморфизмы для динамического программирования: cs.ioc.ee/~tarmo/tday-viinistu/kabanov-slides.pdf
Стивен Тетли
39

Обратите внимание, что их подпись изменилась, потому что она была недостаточно общей, и я включил ее (в шутку) в свой пакет схем рекурсии .

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)

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

Эдвард КМЕТТ
источник
2
Ах да, совершенно очевидно.
Бен Лонго