8

我一直在閱讀關於組合器並且看到它們是多麼有用的(例如,在Haskell的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

儘量減少問題的本質,獲得良好的答案。 – Pindatjuh

+1

什麼是 - 除了名稱 - 「過濾器」和「修改」之間的本質區別? – fuz

+0

「選擇器」從分配中刪除一些點;修飾符調整分佈中某些點的位置。所以我的'過濾器'的意圖是將一個發生器和一個選擇器組合成一個新的發生器,這將創建原始發生器分佈的一個子集。對於'修改' - 從發電機+修改器生成發電機。 –

回答

5

selectormodifier函數已經是完美的組合器!隨着generatorcombine你可以做的東西一樣(我要承擔的具體性的統計分佈,只是使事情了!):

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

您可能需要更動的結合優先級位運算符爲此工作順利:)

一般來說,當我試圖設計一個類型爲A的值的組合庫時,我喜歡保持我的A的「最後」,以便部分應用組合子(您的selectormodifier)可以與.鏈接在一起,而不是必須flip通過籃球。

這裏是一個不錯的博客文章,它可以幫助你設計組合程序,它影響了很多我的思考:Semantic Editor Combinators

編輯:由於combine的類型簽名,我可能誤讀了您的問題。也許我錯過了一些東西,但是分佈不是你的combinator應該處理的更自然的東西嗎?

+0

我的目的是使用組合程序來創建新的發電機,選擇,和改性劑 - 例如,給定一個哈爾頓subrandom發生器和指數衰減發生器,我想將它們結合起來,創造一個哈爾頓/指數生成。 –

相關問題