8

He estado leyendo acerca de los combinadores y he visto lo útiles que son (por ejemplo, en Haskell's Parsec). Mi problema es que no estoy muy seguro de cómo usarlos prácticamente.No estoy seguro de cómo diseñar una biblioteca útil usando los combinadores

Aquí hay un resumen del problema: las distribuciones se pueden generar, filtrar y modificar. Las distribuciones se pueden combinar para crear nuevas distribuciones.

Las interfaces básicas son (en la terminología de tipo pseudo-Haskell):

generator::  parameters -> distribution 

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

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

Ahora, creo que veo tres combinadores:

combine::  generator -> generator -> generator 

filter::  generator -> selector -> generator 

modify::  generator -> modifier -> generator 

Son estos combinadores realidad? ¿Tienen sentido los combinators/hay algún otro combinador obvio que me falta?

Gracias por cualquier consejo.

+1

Trate de reducir su pregunta a su esencia, para obtener buenas respuestas. – Pindatjuh

+1

¿Cuál es, además del nombre, la diferencia esencial entre 'filter' y' modify'? – fuz

+0

Un 'selector' elimina algunos puntos de una distribución; un modificador ajusta la ubicación de algunos puntos en una distribución. Entonces, mi intención con 'filtro' es combinar un generador y un selector en un generador nuevo, que creará un subconjunto de la distribución del generador original. Y para 'modificar': crea un generador a partir de un generador + modificador. –

Respuesta

5

¡Las funciones selector y modifier ya combinan perfectamente! Junto con generator y combine que puede hacer cosas por el estilo (Voy a asumir distribuciones estadísticas de concreción y simplemente hacer las cosas!):

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

Es posible que tenga que perder el tiempo un poco con la prioridad de la cosechadora operador para que esto funcione sin problemas :)

En general, cuando estoy tratando de diseñar una biblioteca combinatoria para los valores del tipo A, me gusta mantener mi A "al final", por lo que la parcialmente aplicada Los combinadores (su selector y modifier) se pueden encadenar junto con . en lugar de tener que flip a través de aros.

Este es un buen artículo de blog que puede ayudarlo a diseñar combinators, influyó mucho en mi pensamiento: Semantic Editor Combinators.

EDIT: Puede que haya leído mal su pregunta, dada la firma de tipo de combine. Tal vez me esté perdiendo algo, pero ¿no serían las distribuciones los objetos más naturales en los que tu combinador debería funcionar?

+0

Mi intención era usar combinators para crear nuevos generadores, selectores y modificadores; por ejemplo, dado un generador de subrandom Halton y un generador exponencialmente en descomposición, me gustaría combinarlos para crear un generador Halton/exponencial. –

Cuestiones relacionadas