Skip to content

Commit

Permalink
Merge pull request #3 from naumen-student/master
Browse files Browse the repository at this point in the history
add lecture5 + HW5
  • Loading branch information
qkeypechenka authored Apr 13, 2021
2 parents e595f5e + dbd6838 commit bed2191
Show file tree
Hide file tree
Showing 7 changed files with 1,876 additions and 1 deletion.
9 changes: 9 additions & 0 deletions homeworks/homework_5/build.sbt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
name := "homework_5"

version := "0.1"

scalaVersion := "2.12.10"

libraryDependencies += "com.lihaoyi" %% "utest" % "0.5.3" % "test"

testFrameworks += new TestFramework("utest.runner.Framework")
39 changes: 39 additions & 0 deletions homeworks/homework_5/homework_5.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Домашнее задание №5 (курс Scala, Naumen)

## Задание 1

Реализуйте класс приюта для животных (`case class Shelter...`), который хранит список (`List`)
животных, которые в нем содержатся. Приют должен быть параметризован типом содержащихся животных.
Например, `Shelter[Cat]` может содержать только котов, а `Shelter[Animal]` любых животных.<br>
Реализуйте метод `+`, который добавляет в приют животное (метод должен вернуть новый приют, а не модифицировать старый).
Тип полученного приюта должен остаться настолько точным, насколько это возможным.
Например, если в приют с котами добавляют кота, то в результате должен снова получиться приют с котами.<br>
`val s: Shelter[Cat] = Shelter(List(Cat("Garfield"))) + Cat("Kuzya")`<br>
Если же в приют с котами добавить собаку, то получится приют с животными.<br>
`val s: Shelter[Animal] = Shelter(List(Cat("Garfield"))) + Dog("Goofy")`<br>
Реализовать метод `++`, который производит сложение двух приютов и возвращает приют,
в котором содержатся животные из обоих, участвовавших в сложении.
Тип результата точно так же должен быть настолько точным, насколько это возможно, исходя из
типов приютов, участвовавших в сложении.<br>
Реализовать метод `getNames`, который возвращает спсок имен животных, содержащихся в приюте.<br>
Тесты должны компилироваться и успешно проходить. Обратите внимание, что до вполнения второго
задания соответствующая часть тестов не будет компилироваться, так что ее можно закомментировать.

## Задание 2

Реализовать тип еда (`trait Food`), который параметризован типом животных, которые
ее могут есть. Например, `Food[Cat]` могут есть только коты, а
`Food[Animal]` могут есть любые животные. Реализовать объекты (`case object`):<br>
`Meat` - мясо, могут есть все животные.<br>
`Milk` - молоко, могут есть коты.<br>
`Bread` - хлеб, могут есть собаки.<br>
Определить для еды метод `feed`, который принимает животное того типа, которым параметризована эта еда,
и возвращает строку, содержащую "<имя животного> eats <название еды со строчной буквы>". Например,
`Meat.feed(Cat("Garfield"))` должно вернуть "Garfield eats meat", а `Milk.feed(Dog("Goofy"))` не должно
компилироваться т.к. собаки не едят молоко.
Реализовать для приюта метод, который получает на вход еду, которая подходит для
содержащихся в нем животных, и выводит список результатов применеия метода `Food.feed` ко
всем животным. Обратите внамение, что `Shelter(List(Cat("Garfield"), Dog("Goofy"))).feed(Milk)` не должно
компилироваться т.к. в этом приюте содержатся и кошки и собаки,
следовательно тип этого приюта - `Shelter[Animal]`, а произвольные животные не могут есть молоко. Единственная
еда, которой их можно было бы покормить - мясо.
1 change: 1 addition & 0 deletions homeworks/homework_5/project/build.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sbt.version = 1.3.3
23 changes: 23 additions & 0 deletions homeworks/homework_5/src/main/scala/Exercises.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
object Exercises {
trait Animal {
def name: String
}

case class Cat(override val name: String) extends Animal

case class Dog(override val name: String) extends Animal



case class Shelter ...



trait Food ...

case object Meat extends Food[Animal] ...

case object Milk extends Food[Cat] ...

case object Bread extends Food[Dog] ...
}
58 changes: 58 additions & 0 deletions homeworks/homework_5/src/test/scala/Test.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import Exercises._
import utest._

object Test extends TestSuite {

val tests = Tests {

//Test task 1

val s1: Shelter[Cat] = Shelter(List(Cat("Garfield")))

val s2: Shelter[Dog] = Shelter(List(Dog("Goofy")))

val s3: Shelter[Animal] = s1 ++ s2

val s4 = s3 + Cat("Kuzya")

assert(s4.getNames.toSet == Set("Garfield", "Goofy", "Kuzya"))

val s5: Shelter[Animal] = s1 + Dog("Barbos")

assert(s5.getNames.toSet == Set("Garfield", "Barbos"))

val s6: Shelter[Dog] = s2 + Dog("Barbos")

assert(s6.getNames.toSet == Set("Goofy", "Barbos"))

//Test task 2

val r1 = s1.feed(Meat)

assert(r1.toSet == Set("Garfield eats meat"))

val r2 = s1.feed(Milk)

assert(r2.toSet == Set("Garfield eats milk"))

val r3 = s2.feed(Meat)

assert(r3.toSet == Set("Goofy eats meat"))

val r4 = s2.feed(Bread)

assert(r4.toSet == Set("Goofy eats bread"))

val r5 = s4.feed(Meat)

assert(
r5.toSet == Set(
"Garfield eats meat",
"Goofy eats meat",
"Kuzya eats meat"
)
)

}

}
4 changes: 3 additions & 1 deletion index.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,12 @@ layout: default
* Лекция 2. [Программирование на Scala. Базовые концепции.](lectures/scala_lecture_2.html)
* Лекция 3. [Система типов в Scala](lectures/scala_lecture_3.html)
* Лекция 4. [Классы и объекты в Scala.(PowerPoint)](lectures/scala_lecture_4.pptx)
* Лекция 5. [Параметрический полиморфизм в Scala](lectures/scala_lecture_5.html)

### Домашние задания
* [Инструкция по предоставлению результатов](https://github.com/naumen-student/naumen.scala.course.2021.spring#%D0%BF%D1%80%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%BE%D0%B2)
* [Задание 1](homeworks/homework_1/homework_1.md) [папка в GitHub](https://github.com/naumen-student/naumen.scala.course.2021.spring/tree/master/homeworks/homework_1)
* [Задание 2](homeworks/homework_2/homework_2.md) [папка в GitHub](https://github.com/naumen-student/naumen.scala.course.2021.spring/tree/master/homeworks/homework_2)
* [Задание 3](homeworks/homework_3/homework_3.md) [папка в GitHub](https://github.com/naumen-student/naumen.scala.course.2021.spring/tree/master/homeworks/homework_3)
* [Задание 4](homeworks/homework_4/homework_4.md) [папка в GitHub](https://github.com/naumen-student/naumen.scala.course.2021.spring/tree/master/homeworks/homework_4)
* [Задание 4](homeworks/homework_4/homework_4.md) [папка в GitHub](https://github.com/naumen-student/naumen.scala.course.2021.spring/tree/master/homeworks/homework_4)
* [Задание 5](homeworks/homework_5/homework_5.md) [папка в GitHub](https://github.com/naumen-student/naumen.scala.course.2021.spring/tree/master/homeworks/homework_5)
Loading

0 comments on commit bed2191

Please sign in to comment.