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ą:
zrobić coś przynajmniej zdalnie i teoretycznie użytecznego obliczeniowo. Oznacza to, że odpowiedzi, które redukują się do,
id
są wykluczone.używać wszystkich funkcji schematu, bez przekazywania id, const lub równoważnych.
nie da się równie dobrze wyrazić prostym, waniliowym fałdem lub czymś podobnym, więc nie wdrażaj po prostu
product
meandrują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.
źródło
IO
w swoim stosie, moglibyśmy użyć słynnejlaunchMissles
funkcji SimonPJ . Ale wydaje mi się, że celem całego tego super-czystego abstrakcyjnego nonsensu jest uniknięcie możliwości takich rzeczy.a
moż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.Odpowiedzi:
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.
źródło
foldr
moż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?)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 .
Wdrożenie również zostało uproszczone.
A od nowej implementacji powinno być oczywiste, jak zaimplementować uogólniony prepromorfizm zygohistomorficzny, poprzez złagodzenie ograniczenia, jakim jest
(Base t)-Branching
strumień, poprzez użyciedistGHisto
zamiast.źródło