Haskell 不确定如何使用组合器设计有用的库
我一直在阅读有关组合词的书籍,并看到它们是多么有用(例如,在Haskell的Parsec中)。我的问题是,我不太确定如何实际使用它们 下面是问题的概要:可以生成、过滤和修改分布。可以组合发行版以创建新发行版 基本接口是(用伪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
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)