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