2016-06-12 6 views
1

distributions에 대한 breeze의 설명서에서 본 예를 통해 머리를 긁적니다.클래스의 인스턴스에 대한 스칼라/

는 랜드 인스턴스를 생성 한 후, 그들은 당신이 다음을 수행 할 수 있음을 보여

이제
import breeze.stats.distributions._ 

val pois = new Poisson(3.0); 
val doublePoi: Rand[Double] = for(x <- pois) yield x.toDouble 

이 매우 멋지다, 내가 전화 할 때 내가 Double 대신 Int으로 얻을 수있는 랜드 개체를 얻을 수 있습니다 samples 방법. 또 다른 예는 다음과 같습니다.

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) 

질문은 무엇입니까? Rand[T]은 컬렉션이 아니며 지금까지 컬렉션에서 보았던 모든 for/yield 예제가 있습니다. 스칼라 문서는별로 언급하지 않지만, 찾은 유일한 것은 here의 for-comprehensions을 번역 한 것입니다. 여기에 기본 규칙은 무엇입니까? 어떻게 다른 방법을 사용할 수 있습니까? (바람에 관련된 대답 일 필요는 없습니다)

+2

등이 이해를위한 기본적'flatMap's 한'지도'의 조합에 대한 문법 설탕입니다. ['Poisson'] (http://www.scalanlp.org/api/breeze/#breeze.stats.distributions.Poisson)은'flatMap'과'map'을 모두 구현하기 때문에 여러분은 이해할 수 있습니다. 귀하의 경우에 대한 이해는'pois.map (_. toDouble)'과 유사합니다. –

+0

또한 임의 분포 *는 모음입니다.그것은 다소 이상한 컬렉션입니다 ** ** ** ** ** ** ** ** ** 요소를 포함하고있는 ** ** 각 ** 요소를 포함하고 있습니다 만, 그것을 콜렉션으로 해석 할 수 있습니다. (블룸 필터는 생각해 보면 더 이상한 필터입니다.) –

답변

0

이해는 flatMap, map 및 withFilter에 대한 문법적 설탕입니다. 이해를위한 주된 요구 사항은 그러한 방법이 구현된다는 것입니다. 따라서 컬렉션에만 국한되지 않습니다. 독해력에 사용되는 일부 일반적인 비 모음은 Option, Try 및 Future입니다. 귀하의 경우에는

는, 푸 아송 랜드

https://github.com/scalanlp/breeze/blob/master/math/src/main/scala/breeze/stats/distributions/Rand.scala

이 특성이 정의지도, flatmap 및 withFilter있다라는 특성에서 상속 보인다.

팁 : 인 IntelliJ 같은 IDE를 사용하는 경우 - 당신이 이해를 위해, 그리고이 표현을 desugared로 변환 선택했다 당신에 + 를 입력 고도를 누를 수 있고 당신이 그것을 확장하는 방법을 볼 수 있습니다.

1

스칼라 임의로 또한 withFilter 등을 이용하여 필터를 적용 등가 flatMapmap와 통화를하고 forfor-yield 표현식 번역을위한 규칙을 갖는다. 이해력 표현을 위해 상응하는 메소드 호출로 변환하는 방법에 대한 실제 스펙은 스칼라 스펙의 this section에서 찾을 수 있습니다.

예제를 작성하여 컴파일하면 기본 변환이 for-yield 표현으로 나타납니다. 이는 유형 트리를 출력 할 scalac -Xprint:typer 명령을 사용하여 수행됩니다 : 여기

val letterDist: breeze.stats.distributions.Rand[String] = 
     pois.map[String](((x: Int) => { 
      val i: Int = if (x.>(26)) 
      x.%(26) 
      else 
      x; 
      abc.apply(i) 
})); 

당신이 for-yield은 하나의 mapInt 전달하고 표현식 내부의 if-else을 적용하기로 바뀝니다 것을 볼 수 있습니다. 이 Rand[T] has a map method 정의 때문에 작동 : 링크에서 언급

def map[E](f: T => E): Rand[E] = MappedRand(outer, f) 
관련 문제