2011-02-20 7 views
150

Tak, these ones:rzeczywistych aplikacjach z zygohistomorphic prepromorphisms

{-#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 jesteś (HHOS) żart. Szukam prawdziwego przykładu na prostą wartość hackowania i na koniec dodam do wiki: "To jest idiomatyczny sposób wyrażania XYZ". I będzie umieścić nagrodę w tej sprawie, jeśli nie uda Ci się wymyślić rozwiązanie. Jeśli całkowicie zapominasz o tym, co robią, Edward opublikował short explanation na Reddit.

Uprawnieni Odpowiedzi należy:

  1. coś zrobić przynajmniej teoretycznie obliczeniowo zdalnie i użyteczne. Oznacza to, że odpowiedzi, które ograniczają się do id są obecnie niedostępne.

  2. używać wszystkich funkcji schematu, nie przekazując id, const lub równoważnego.

  3. nie równie dobrze można wyrazić za pomocą prostego fałdu waniliowego lub podobnego, więc nie wykonuj po prostu product w meandrujący sposób.

punkty będą się na:

  • Dobrze znanym problemem lub algorytmu

  • rozwiązane odpowiednio wyrażone w niezwykły sposób zyskuje

  • jasności i/lub wydajność

  • i/Lub siekać wartość

  • i/lub lulz, w przybliżeniu takiej kolejności, jak również

  • wysokich rangą odpowiedzi (yay demokracja)

Należy również pamiętać Edward's answer poniżej. Jaką implementację ZHPM używasz, to twój wybór.

+4

Gdybyś umieścił 'IO' w swoim stosie, moglibyśmy użyć znanej funkcji SimonPJ' launchMissles'. Ale myślę, że najważniejszym punktem tego super-czystego abstrakcyjnego nonsensu jest uniknięcie możliwości takich rzeczy. – Yitz

+4

Cóż, 'a' może być wszystkim, więc możesz swobodnie budować wartość zamówienia, która strategicznie uruchamia pociski w oparciu o ocenę danych wejściowych. – barsoap

+47

Kliknąłem na to pytanie, ponieważ nie miałem pojęcia, o czym do cholery mówisz. +1 dobry sir, +1 – Drew

Odpowiedz

38

Uwaga, podpis tych znaków uległ zmianie, ponieważ był niewystarczająco ogólny i dołączyłem go (jako żart) do mojego pakietu 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 

Implementacja została również uproszczona.

zygoHistoPrepro f = gprepro (distZygoT f distHisto) 

I z nowej realizacji powinno być oczywiste, jak zaimplementować uogólnione zygohistomorphic prepromorphism, poprzez rozluźnienie ograniczenie, które masz (Base t)-Branching strumień, dzięki zastosowaniu distGHisto zamiast.

51

Sharon Curtis i Shin-Cheng Mu mają funkcjonalną perłę wykorzystującą zygomorfizmy do znajdowania maksymalnie gęstych segmentów (uogólnienie maksymalnych sum segmentów). Zygomorfizmy są pozornie dobrym rozwiązaniem problemów z przesuwaniem okien, gdy już się do nich przyzwyczaisz.

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

Chciałbym nominować autorów dla dodatkowego kredytu, jak oni unikać korzystania z stałoprzecinkowym Mu funktora.

+0

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

+3

Kod jest dostępny pod linkiem poniżej erraty na stronie docelowej. Rzeczywista definicja zygomorfizmu znajduje się w pliku Main.hs - różni się od definicji w pracy. Jest "tylko" zygomorfizmem, a nie "zygohistomorficznym prepromorfizmem" - zygomorfizm jest najbliższą rzeczą, jaką widziałem w rzeczywistym świecie. Chociaż istnieją slajdy Jevgeni Kabanov wykorzystujące histomorfizmy do programowania dynamicznego: http://www.cs.ioc.ee/~tarmo/tday-viinistu/kabanov-slides.pdf –

Powiązane problemy