8

Czytałem o kombinatorach i widziałem, jak użyteczne są one (na przykład w Paraskach Haskella). Moim problemem jest to, że nie jestem całkiem pewien, jak z nich korzystać praktycznie.Nie wiem, jak zaprojektować użyteczną bibliotekę przy użyciu kombinatorów

Oto zarys problemu: dystrybucje można generować, filtrować i modyfikować. Dystrybucje można łączyć, tworząc nowe dystrybucje.

Podstawowe interfejsy (w rodzaju pseudo-Haskell terminologii):

generator::  parameters -> distribution 

selector::  parameters -> (distribution -> distribution) 

modifier::  parameters -> (distribution -> distribution) 

Teraz myślę, że widzę trzy kombinatorów:

combine::  generator -> generator -> generator 

filter::  generator -> selector -> generator 

modify::  generator -> modifier -> generator 

są te faktycznie kombinatorów? Czy kombinatory mają sens? Czy są jakieś inne oczywiste kombinatory, których mi brakuje?

Dzięki za radę.

+1

Postaraj się ograniczyć swoje pytanie do jego esencji, aby uzyskać dobre odpowiedzi. – Pindatjuh

+1

Czym jest - oprócz nazwy - zasadnicza różnica między "filtrem" a "modyfikacją"? – fuz

+0

"Selektor" usuwa niektóre punkty z rozkładu; modyfikator dostosowuje położenie niektórych punktów w rozkładzie. Tak więc moim zamysłem z "filtrem" jest połączenie generatora i selektora z nowym generatorem, który utworzy podzbiór rozkładu oryginalnego generatora. I dla "modyfikuj" - zrób generator z modyfikatora generatora +. –

Odpowiedz

5

Funkcje selector i modifier są już doskonale dobrymi kombinatorami! Wraz z generator i combine można zrobić rzeczy jak (mam zamiar zakładać rozkładów statystycznych dla konkretności i po prostu zrobić rzeczy!):

modifier (Scale 3.0) $ generator StandardGaussian `combine` selector (LargerThan 10) . modifier (Shift 7) $ generator (Binomial 30 0.2) 

Być może trzeba będzie poeksperymentować trochę z priorytetem kombajnu operator, aby to działało sprawnie :)

Generalnie, kiedy próbuję zaprojektować bibliotekę kombinatorową dla wartości typu A, lubię trzymać moje "A" na końcu ", tak że częściowo zastosowane kombinatory (twoje selector i modifier) można połączyć razem z . zamiast do flip przez obręcze.

Oto ładny artykuł na blogu, który może pomóc w projektowaniu kombinatorów, co wpłynęło na wiele moich przemyśleń: Semantic Editor Combinators.

EDYCJA: Być może błędnie przeczytałem twoje pytanie, biorąc pod uwagę podpis typu combine. Może czegoś mi brakuje, ale czy dystrybucje nie będą bardziej naturalnymi przedmiotami, na których powinien działać twój kombinator?

+0

Moim zamiarem było użycie kombinatorów do tworzenia nowych generatorów, selektorów i modyfikatorów - na przykład, biorąc pod uwagę generator podprogramów Haltona i wykładniczy rozkładający się generator, chciałbym je połączyć, aby utworzyć generator Halton/wykładniczy. –

Powiązane problemy