2013-11-20 3 views
5

Я новичок в языке и пытаюсь выяснить, как читать некоторые из кода в нем. Вот пример кода, который я пытаюсь выяснить:Что делает «<-» в scala?

lazy val genHeap: Gen[H] = for{ 
    n <- arbitrary[A] 
    h <- frequency((1,value(empty)),(9,genHeap)) 
} yield insert(n,h) 

Я не совсем понимаю, что происходит:

  • Возвращаемый тип Gen?
  • Выполняет ли <- оператор =?
  • Является ли оператор yield, создающий кучу с каждой итерацией, вставляя новый элемент?
+1

Привет. Вероятно, вы захотите начать здесь: http://www.artima.com/pins1ed/for-expressions-revisited.html – david

ответ

9

Приветствую вас, ученик Курсеры! Принципы реактивного программирования - это не совсем простое место, чтобы начать изучать Scala! Это продвинутый курс Scala.

Тип возврата - это Gen?

Да, это то, что означает :. (The Gen сам по себе является объектом, генератор случайных, чтобы быть точным, которые могут производить последовательность значений, каждое из которых имеет один и тот же тип, как параметр типа -. В этом случае, H)

ли < - действовать как оператор '='?

Не совсем.

и инструкция о выходе. Насколько я понимаю, она создает кучу с каждой итерацией, вставив новый элемент?

На самом деле это рекурсия, а не итерация ... но по существу, да.

A для выражения .. для выражения является причудливым способом записи серии из map, flatMap и withFilter выписок. Давайте desugar его на обычный 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, или результат снова вызывая genHeap с вероятностью 0,9), а затем вставляя A в H, чтобы получить новый номер H.

Эти A и H s оба являются абстрактными типами, между прочим.

Да, я бы сказал, это довольно продвинутый материал. Если вы даже не знаете, что означает :, вы определенно начинаете не в том месте.

+3

Фактически, даже когда вы следовали первому курсу, вы можете полностью потеряться в этом упражнении ... – JulienD

+0

Является ли произвольное [A] здесь нечто похожее на поток? И функция рекурсивно вызывает genHeap до тех пор, пока она не станет пустой, и постройте кучу оттуда? –

+1

@ Allen Wang 'Arbitrary [A]' является императивным утверждением, которое генерирует случайное значение типа 'A', используя неявный' Gen [A] 'в области. Вы можете думать об этом как о концептуальном, как если бы вы выбрали следующее случайное значение из бесконечного потока случайных значений. И да, «genHeap» - это рекурсивное значение, которое «называет себя» до тех пор, пока оно не станет пустым - поэтому его определение обязательно должно включать в себя лень - в этом случае лень исходит из того, что он определяется как «ленивый val '. –

Смежные вопросы