Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add lecture5 + HW5 #1

Merged
merged 1 commit into from
Apr 14, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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