2016-04-10 28 views
3

Jeneratörün bir örneğini içeren bir Jeneratör kombinasyonunun (örneğin, ScalaCheck veya Haskell'in QuickCheck'lerindekine benzer) bir Jeneratör birleştiricilerin bir sürümünü uygulamak istiyorum. esinti kütüphanesi). Bir monad olduğundan, Rand harita ve flatMap'i uygular. Yaygın olarak, Gen'i bir monad olarak uygulamak istiyorum. Aşağıda gösterildiği üzere, Gen için haritanın uygulanması basittir:Agrega monadındaki flatMap'in uygulanması

// Rand is from the breeze library 
trait Rand[T] { 
    def map[U](f: T => U): Rand[U] 
    def flatMap[U](f: T => Rand[U]): Rand[U] 
} 

case class Gen[T](dist: Rand[T]) { 
    def map[U](f: T => U): Gen[U] = Gen(dist.map { f }) 

    def flatMap[U](f: T => Gen[U]): Gen[U] = { 
    // How to implement this? 
    } 
} 

Ancak flatMap uygulanmalıdır nasıl bana açık değildir. Bu kolayca elde edilebilir mi, yoksa (örneğin), bazı ara veri türü üzerinden bir dolaylılık seviyesi gerektiriyor mu?

cevap

1

olası bir uygulaması

def flatMap[U](f: T => Gen[U]): Gen[U] = 
    Gen (dist.flatMap {f(_).dist}) 
1

aşağıdaki gibi Gen şey amaçlanan semantik Are olabilir? bu doğru, o zaman Gen.flatMap çıkışı ortak dağılımını hesaplamak için bir yol sağlaması gerekir iki rastgele örnekler, her dağıtımdan birini veya Rand oluşturmak gerekir ya

flipAndRoll == Gen(1 -> 0.025, 2 -> 0.025, 3 -> 0.025, 4 -> 0.025, 5 -> 0.45, 5 -> 0.45) 

:

val UnfairCoin = Gen(Rand(Heads -> 0.9, Tails -> 0.1)) 
val UnfairDieHi = Gen(Rand(1 -> 0.0, 2 -> 0.0, 3 -> 0.0, 4 -> 0.0, 5 -> 0.5. 6 -> 0.5)) 
val UnfairDieLo = Gen(Rand(1 -> 0.25, 2 -> 0.25, 3 -> 0.25, 4 -> 0.25, 5 -> 0.0, 6 -> 0.0)) 

def headsHiTailsLo(coinFlip: CoinFlip) = coinFlip match { 
    case Heads => UnfairDieHi 
    case Tails => UnfairDieLo 
} 

val flipAndRoll = UnfairCoin flatMap { headsHighTailsLo _ } 

ve U'a yansıtın.

Rand.flatMap dokümantasyonuna hızlıca baktım ve iki ardışık rastgele örneği olmayan bir Rand ürettiği anlaşılıyor. Bu doğruysa, kazananınız chi's answer'dur.

İki rastgele değişken bağımsız değilse, yapmanız gereken bazı işler olabilir.

+0

Neyse ki, bağımsızlık istenen özelliktir. – NietzscheanAI