8

Kombinatörleri okuyordum ve ne kadar yararlı olduklarını gördüm (örneğin, Haskell'in Parsec'inde). Benim problemim, onları pratikte nasıl kullanacağımı tam olarak bilmiyorum.Taraklayıcıları kullanarak kullanışlı bir kitaplığın nasıl tasarlanacağından emin değilsiniz

Sorunun ana hatları şöyledir: dağıtımlar oluşturulabilir, filtrelenebilir ve değiştirilebilir. Yeni dağıtımlar oluşturmak için dağılımlar birleştirilebilir.

temel arayüzleri bulunmaktadır (sözde Haskell tipi terminolojisinde):

combine::  generator -> generator -> generator 

filter::  generator -> selector -> generator 

modify::  generator -> modifier -> generator 

bunların aslında combinators Are:

generator::  parameters -> distribution 

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

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

Şimdi, ben üç combinators bkz düşünüyorum? Kombinatorler mantıklı mı/eksik olduğum başka açık kombinatorler var mı?

Her türlü öneriniz için teşekkürler.

+1

Sorunuzu özüne, iyi yanıtlar almaya çalışın. – Pindatjuh

+1

İsim - adın dışında - filtre ile 'değiştir' arasındaki temel fark nedir? – fuz

+0

A 'seçici', bazı noktaları dağıtımdan kaldırır; Bir düzenleyici, bir dağıtımdaki bazı noktaların konumunu ayarlar. Yani 'filtre' ile ilgili niyetim, bir jeneratörü ve seçiciyi, orijinal jeneratörün dağıtımının bir alt kümesini yaratacak olan yeni bir jeneratöre birleştirmektir. Ve 'değiştirmek' için - bir jeneratör + değiştiriciden bir jeneratör yapın. –

cevap

5

selector ve modifier işlevleri zaten mükemmel iyi kombinatorlerdir! generator ve combine ile birlikte size böyle şeyler yapabilir (ı somutluktan için istatistiksel dağılımları varsayar ve sadece şeyler yapacağım!):

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

birleştirebilirsiniz önceliği ile biraz etrafında karışıklık gerekebilir Bu iş için sorunsuz bir şekilde çalışın :)

Genel olarak, A türünde değerler için bir birleştirici kitaplığı tasarlamaya çalıştığımda, A'un "sonunda" kalmamayı seviyorum, böylece kısmen uygulanmış kombinatorler (sizin selector ve modifier) flip yerine . ile birlikte zincirlenebilir çemberler aracılığıyla.

Kombinatörleri tasarlamanıza yardımcı olabilecek güzel bir blog makalesi, benim düşüncemi çok etkiledi: Semantic Editor Combinators.

DÜZENLEME: combine'un tip imzası düşünüldüğünde, sorunuzu yanlış okumuş olabilir. Belki bir şeyleri özlüyorum, ama dağıtımlar sizin birleştiricinizin üzerinde çalışması gereken daha doğal nesneler değil miydi?

+0

Amacım yeni jeneratörler, seçiciler ve değiştiriciler yaratmak için kombinatorleri kullanmaktı - örneğin Halton subrandom jeneratörü ve üstel olarak bozulan bir jeneratör verildiğinde, bunları bir Halton/üstel jeneratörü oluşturmak için birleştirmek istiyorum. –