Rzeczywiste zastosowania prepromorfizmów zygohistomorficznych


156

Tak, te :

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

Tak, wiem, że to żart ( HHOS ). Szukam rzeczywistego przykładu dla prostej wartości hackowania i na koniec, ale nie mniej ważny, aby dodać go do wiki, mówiąc „To jest idiomatyczny sposób wyrażenia XYZ”. I będzie umieścić bounty na to nie powinieneś wymyślić rozwiązanie. Jeśli całkowicie zgubiłeś się w tym, o co im chodzi, Edward opublikował krótkie wyjaśnienie na reddicie.

Kwalifikujące się odpowiedzi muszą:

  1. zrobić coś przynajmniej zdalnie i teoretycznie użytecznego obliczeniowo. Oznacza to, że odpowiedzi, które redukują się do, idsą wykluczone.

  2. używać wszystkich funkcji schematu, bez przekazywania id, const lub równoważnych.

  3. nie da się równie dobrze wyrazić prostym, waniliowym fałdem lub czymś podobnym, więc nie wdrażaj po prostu productmeandrując.

Punkty bonusowe zostaną przyznane:

  • Dobrze znany problem lub algorytm

  • rozwiązane, odpowiednio wyrażone, w niecodzienny sposób, który zyskuje

  • przejrzystość i / lub wydajność

  • i / lub wartość hackowania

  • i / lub lulz, mniej więcej w tej kolejności, jak również

  • wysokiej rangi odpowiedzi (yay demokracja)

Zwróć także uwagę na odpowiedź Edwarda poniżej. To, z jakiej implementacji ZHPM korzystasz, zależy od Ciebie.


5
Gdybyś zawarł IOw swoim stosie, moglibyśmy użyć słynnej launchMisslesfunkcji SimonPJ . Ale wydaje mi się, że celem całego tego super-czystego abstrakcyjnego nonsensu jest uniknięcie możliwości takich rzeczy.
Yitz,

6
Cóż, amoże to być wszystko, więc nie krępuj się skonstruować wartości IO, która strategicznie wyrzuca pociski na podstawie oceny danych wejściowych.
Barsoap

49
Kliknąłem na to pytanie, ponieważ nie miałem pojęcia, o czym do diabła mówisz. +1 dobry panie, +1
Drew

7
Ktoś, kto chce użyć wszystkich komponentów, dobrze by zrobił, gdyby ręcznie napisał, do czego rozszerza się rekurencja zygohistomorficzna prepromorfizmu, a następnie poszukałby problemów, które wymagają wszystkich tych wzorców; imperatywne pętle zwykle wykonują dowolnie skomplikowane śledzenie, więc mogą być dobrym miejscem do wyszukiwania.
Edward Z. Yang

3
i co ważniejsze - czy się połączy ?! (bardzo przepraszam, nie mogłem się oprzeć)
n00b

Odpowiedzi:


52

Sharon Curtis i Shin-Cheng Mu mają Perłę Funkcjonalną wykorzystującą zygomorfizmy do znajdowania segmentów o maksymalnej gęstości (uogólnienie maksymalnych sum segmentów). Zygomorfizmy pozornie dobrze sprawdzają się w przypadku problemów z przesuwanymi oknami, gdy już się do nich przyzwyczaisz.

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

Nominowałbym autorów do dodatkowego uznania, ponieważ uniknęli stosowania funktora Mu stałopunktowego.


Od skimmingu myślę, że widzę, jak używają histo podczas śledzenia DRSP (w tym samym sensie, w jakim zwykły foldrmoże spojrzeć na listę, którą już utworzył), ale prepro nie jest dla mnie od razu widoczne. Czy mógłbyś to rozwinąć? (i jeśli to możliwe, podaj krótki + słodki kod, który możemy umieścić na stronie wiki?)
barsoap

3
Kod jest dostępny pod linkiem pod erratą na stronie docelowej. Właściwa definicja zygomorfizmu znajduje się w pliku Main.hs - różni się od definicji w artykule. To jest „tylko” zygomorfizm, a nie „zygohistomorficzne prepromorfizmy” - zygomorfizm jest najbliższą rzeczą, jaką widziałem w prawdziwym świecie. Chociaż są slajdy Jevgeni Kabanov wykorzystujące histomorfizmy do programowania dynamicznego: cs.ioc.ee/~tarmo/tday-viinistu/kabanov-slides.pdf
stephen tetley

39

Zauważ, że ich sygnatura uległa zmianie, ponieważ była niewystarczająco ogólna i włączyłem ją (jako żart) do pakietu schematów rekurencji .

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

Wdrożenie również zostało uproszczone.

zygoHistoPrepro f = gprepro (distZygoT f distHisto)

A od nowej implementacji powinno być oczywiste, jak zaimplementować uogólniony prepromorfizm zygohistomorficzny, poprzez złagodzenie ograniczenia, jakim jest (Base t)-Branchingstrumień, poprzez użycie distGHistozamiast.


2
Ach tak, całkiem oczywiste.
Ben Longo
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.