1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
module fors {
trait Person {
val name: String;
val age: Int;
}
def printOlderThan20(xs: Seq[Person]): Iterator[String] =
printOlderThan20(xs.elements);
def printOlderThan20(xs: Iterator[Person]): Iterator[String] =
for (val p <- xs; p.age > 20) yield p.name;
def divisors(n: Int): List[Int] =
for (val i <- List.range(1, n); n % i == 0) yield i;
def isPrime(n: Int) = divisors(n).length == 2;
def findNums(n: Int): Iterator[Pair[Int, Int]] =
for (val i <- Iterator.range(1, n);
val j <- Iterator.range(1, i-1);
isPrime(i+j)) yield Pair(i, j);
def sum(xs: List[Double]): Double =
(0.0 foldl_: xs) { (x, y) => x + y }
def scalProd(xs: List[Double], ys: List[Double]) =
sum(for(val Pair(x, y) <- xs zip ys) yield x * y);
type Lst = List[Any];
val books = List(
'book('title("Structure and Interpretation of Computer Programs"),
'author("Abelson, Harald"),
'author("Sussman, Gerald J.")),
'book('title("Principles of Compiler Design"),
'author("Aho, Alfred"),
'author("Ullman, Jeffrey")),
'book('title("Programming in Modula-2"),
'author("Wirth, Niklaus")));
def findAuthor(books: Lst) =
for (val 'book(book: Lst) <- books;
val 'title(title: String) <- book;
(title indexOf "Program") >= 0;
val 'author(author: String) <- book) yield author;
for (val 'book(b: Lst) <- books;
val 'author(author: String) <- b;
author startsWith "Ullman";
val 'title(title: String) <- b) yield title;
removeDuplicates(
for (val 'book(b1: Lst) <- books;
val 'book(b2: Lst) <- books;
b1 != b2;
val 'author(a1: String) <- b1;
val 'author(a2: String) <- b2;
a1 == a2) yield Pair(a1, a2));
def removeDuplicates[a](xs: List[a]): List[a] =
xs.head :: removeDuplicates(for (val x <- xs.tail; x != xs.head) yield x)
}
|