我是该语言的新手,并试图弄清楚如何阅读其中的一些代码。这是我想要弄清楚的示例代码:
lazy val genHeap: Gen[H] = for{
n <- arbitrary[A]
h <- frequency((1,value(empty)),(9,genHeap))
} yield insert(n,h)
我不太明白发生了什么:
Gen
?<-
是否充当=
运营商?答案 0 :(得分:9)
您好,Coursera同学!反应式编程课程的原理并不是开始学习Scala的最简单的地方!这是一门高级Scala课程。
类型返回是Gen?
是的,这就是:
的含义。 (Gen
本身是一个对象,一个准确的随机生成器,它可以生成一系列值,每个值与其类型参数具有相同的类型 - 在本例中为H
。)
&lt; - 作为'='运算符吗?
不完全是。
和yield语句..据我所知,它是通过插入一个新元素为每次迭代构建一个堆?
实际上它是递归,而不是迭代......但实质上是,是的。
for..yield表达式是一种编写一系列map
,flatMap
和withFilter
调用的奇特方式。让我们把它变成普通的Scala代码:
lazy val genHeap: Gen[H] = arbitrary[A].flatMap(n => frequency((1,value(empty)),(9,genHeap)).map(h => insert(n,h)))
因此,H
生成器(genHeap
)是以生成任意A
开始,然后生成任意H
(空H
概率为0.1,或者以{0.9}的概率再次调用genHeap
本身的结果,然后将A
插入H
以获得新的H
。
顺便说一下,这些A
和H
都是抽象类型。
是的,我会说这是非常先进的东西。如果你甚至不知道:
的含义,你肯定是从错误的地方开始的。