Haskell 不确定如何使用组合器设计有用的库

Haskell 不确定如何使用组合器设计有用的库,haskell,functional-programming,higher-order-functions,combinators,Haskell,Functional Programming,Higher Order Functions,Combinators,我一直在阅读有关组合词的书籍,并看到它们是多么有用(例如,在Haskell的Parsec中)。我的问题是,我不太确定如何实际使用它们 下面是问题的概要:可以生成、过滤和修改分布。可以组合发行版以创建新发行版 基本接口是(用伪Haskell类型术语): 现在,我想我看到了三个组合词: combine:: generator -> generator -> generator filter:: generator -> selector -> genera

我一直在阅读有关组合词的书籍,并看到它们是多么有用(例如,在Haskell的Parsec中)。我的问题是,我不太确定如何实际使用它们

下面是问题的概要:可以生成、过滤和修改分布。可以组合发行版以创建新发行版

基本接口是(用伪Haskell类型术语):

现在,我想我看到了三个组合词:

combine::     generator -> generator -> generator

filter::      generator -> selector -> generator

modify::      generator -> modifier -> generator
这些真的是组合子吗?这些组合词有意义吗/我还缺少其他明显的组合词吗


谢谢您的建议。

选择器和修改器函数已经是非常好的组合器了!除了
generator
combine
之外,您还可以做一些事情,比如(我将假设统计分布的具体性,并只是虚构出来!):

您可能需要对联合收割机操作员的优先级进行一些调整,才能使其顺利工作:)

一般来说,当我试图为
a
类型的值设计一个组合器库时,我喜欢将
a
的“结尾”保留下来,这样部分应用的组合器(您的
选择器和
修饰符)就可以用
链接在一起,而不必用
翻转

这里有一篇很好的博客文章,可以帮助你设计组合器,它影响了我的很多想法:


编辑:鉴于
combine
的类型签名,我可能误解了您的问题。也许我遗漏了什么,但分布不是你的组合器应该处理的更自然的对象吗?

试着把你的问题归结为它的本质,为了得到好的答案,
filter
modify
之间除了名称之外的本质区别是什么?“选择器”从分布中删除一些点;修改器调整分布中某些点的位置。因此,我使用“过滤器”的目的是将生成器和选择器组合成一个新的生成器,它将创建原始生成器分布的子集。对于“修改”——从生成器+修饰符生成生成器。我的意图是使用组合符创建新的生成器、选择器和修饰符——例如,给定一个Halton次随机生成器和一个指数衰减生成器,我想将它们组合起来创建一个Halton/指数生成器。
combine::     generator -> generator -> generator

filter::      generator -> selector -> generator

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