Застосування реального світу зигогістоморфних препроморфізмів


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лукавий спосіб.

Бонусні бали будуть надані:

  • Загальновідома проблема або алгоритм

  • вирішується, відповідно виражається, незвичним способом, який отримує

  • чіткість та / або ефективність

  • та / або значення злому

  • та / або люлз, приблизно в такому порядку, як і

  • відповіді високого рангу (так, демократія)

Також зверніть увагу на відповідь Едварда нижче. Яку реалізацію ZHPM ви використовуєте - це ваш вибір.


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/

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


Зі скимінгу, я думаю, я бачу, як вони використовують histo під час відстеження DRSP (у тому ж сенсі, що простий foldrможе переглянути список, який він вже сконструював), але препрос мені не відразу видно. Не могли б ви детальніше? (і, якщо можливо, дайте короткий + солодкий код, який ми можемо застосувати на сторінці вікі?)
barsoap

3
Код доступний за посиланням під errata на цільовій сторінці. Фактичне визначення зигоморфізму міститься у файлі Main.hs - його відмінності від визначення у статті. Це "просто" зигоморфізм, а не "зигогістоморфні препроморфізми" - зигоморфізм - це найближче, що я бачив із використанням у реальному світі. Хоча є слайди Євгена Кабанова, які використовують істоморфізми для динамічного програмування: cs.ioc.ee/~tarmo/tday-viinistu/kabanov-slides.pdf
Stephen tetley

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
Ага так цілком очевидно.
Бен Лонго
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.