Ich kratze mich an einem Beispiel, das ich in Brees Dokumentation über distributions gesehen habe.scala for/yield on fall der Klasse
Nach einer Rand-Instanz erstellen, zeigen sie, dass Sie Folgendes tun:
import breeze.stats.distributions._
val pois = new Poisson(3.0);
val doublePoi: Rand[Double] = for(x <- pois) yield x.toDouble
Nun, dies ist sehr cool, ich kann ein Rand Objekt bekommen, dass ich Double
statt Int
bekommen kann, wenn ich rufe die samples
Methode. Ein anderes Beispiel könnte sein:
val abc = ('a' to 'z').map(_.toString).toArray
val letterDist: Rand[String] = for(x <- pois) yield {
val i = if (x > 26) x % 26 else x
abc(i)
}
val lettersSamp = letterDist.samples.take(20)
println(letterSamp)
Die Frage ist, was hier vor sich geht? Rand[T]
ist keine Sammlung, und alle For/Yield-Beispiele, die ich bisher gesehen habe, arbeiten an Sammlungen. Die Scala-Dokumente erwähnen nicht viel, das einzige, was ich gefunden habe, ist das Übersetzen von For-Comprehensions in here. Was ist die zugrunde liegende Regel hier? Wie sonst kann dies verwendet werden (muss nicht eine Briese bezogene Antwort sein)
LIke in der Verbindung erwähnt, eine für das Verständnis ist im Grunde syntaktischer Zucker für eine Kombination von 'flatMap's und einer' map'. Sie können ein Verständnis schreiben, weil ['Poisson'] (http://www.scalanlp.org/api/breeze/#breeze.stats.distributions.Poisson) sowohl' flatMap' als auch 'map' implementiert. In Ihrem Fall ist das für das Verständnis analog zu 'pois.map (_. ToDouble)'. –
Auch eine zufällige Verteilung * ist * eine Sammlung.Es ist eine ziemlich seltsame Sammlung, die ** ** ** ** ** ** ** enthält ** und nicht ** definitiv ** enthält ** spezifische ** Elemente, aber Sie können es als eine Sammlung interpretieren. (Ein Bloom-Filter ist ein noch seltsamer, wenn Sie darüber nachdenken.) –