Не знаете, как создать полезную библиотеку с использованием комбинаторов - PullRequest
8 голосов
/ 16 августа 2011

Я читал о комбинаторах и видел, насколько они полезны (например, в Parsec Хаскелла). Моя проблема в том, что я не совсем уверен, как их использовать практически.

Вот краткое описание проблемы: распределения могут быть сгенерированы, отфильтрованы и изменены. Распределения могут быть объединены для создания новых распределений.

Основные интерфейсы (в терминологии псевдо-Хаскеля):

generator::      parameters -> distribution

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

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

Теперь я думаю, что вижу три комбинатора:

combine::     generator -> generator -> generator

filter::      generator -> selector -> generator

modify::      generator -> modifier -> generator

Это на самом деле комбинаторы? Имеют ли смысл комбинаторы / есть ли другие очевидные комбинаторы, которые мне не хватает?

Спасибо за любой совет.

1 Ответ

5 голосов
/ 16 августа 2011

Функции selector и modifier уже являются отличными комбинаторами!Наряду с generator и combine вы можете делать что-то вроде (я собираюсь взять статистические распределения для конкретности и просто выдумывать!):

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

Возможно, вам придется немного повозитьсяс приоритетом оператора объединения, чтобы это работало гладко:)

В общем, когда я пытаюсь создать библиотеку комбинаторов для значений типа A, мне нравится сохранять мой A 's "в конце", так что частично примененные комбинаторы (ваши selector и modifier) могут быть соединены вместе с . вместо того, чтобы flip проходить через обручи.

Вот хорошая статья в блоге, которая может помочь вам в разработке комбинаторов, она повлияла на многие мои мысли: Комбинаторы семантического редактора .

РЕДАКТИРОВАТЬ: возможно, я неправильно понял ваш вопросс учетом сигнатуры типа combine.Может быть, я что-то упускаю, но не будут ли распределения более естественными объектами, с которыми должен работать ваш комбинатор?

...