From 692aa906bd5fe0b2735e34f319a7eb41494a3687 Mon Sep 17 00:00:00 2001 From: OlegGubanov Date: Fri, 29 Apr 2022 23:59:21 +0500 Subject: [PATCH] homework_9 --- .../homework_9/src/main/scala/ListOps.scala | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/homeworks/homework_9/src/main/scala/ListOps.scala b/homeworks/homework_9/src/main/scala/ListOps.scala index 826c38f..bbfbd64 100644 --- a/homeworks/homework_9/src/main/scala/ListOps.scala +++ b/homeworks/homework_9/src/main/scala/ListOps.scala @@ -1,3 +1,4 @@ +import DataList.{EmptyList, NonEmptyList} import scala.annotation.tailrec object ListOps { @@ -9,8 +10,13 @@ object ListOps { * @param f функция свёртывания. Применяется попарно к предыдущему результату применения и i-ому элементу списка * @return None - если список пустой */ - def foldOption[T](f: (T, T) => T): DataList[T] => Option[T] = ??? - + def foldOption[T](f: (T, T) => T): DataList[T] => Option[T] = { + case NonEmptyList(head, tail) => foldOption(f)(tail) match { + case Some(tail) => Some(f(head, tail)) + case None => Some(head) + } + case EmptyList => None + } /** * Используя foldOption[T](f: (T, T) => T) реализуйте суммирование всех элементов списка. @@ -22,7 +28,13 @@ object ListOps { */ def sumT(a: T, b: T) = implicitly[Numeric[T]].plus(a, b) - ??? + foldOption(sumT)(list).getOrElse(Numeric[T].zero) + } + + @tailrec + def reverse[T](l: DataList[T], buffer: DataList[T]): DataList[T] = l match { + case NonEmptyList(head, tail) => reverse(tail, NonEmptyList(head, buffer)) + case EmptyList => buffer } /** @@ -30,7 +42,11 @@ object ListOps { * @param f - фильтрующее правило (если f(a[i]) == true, то элемент остаётся в списке) */ @tailrec - private def filterImpl[T](f: T => Boolean)(buffer: DataList[T])(l: DataList[T]): DataList[T] = ??? + private def filterImpl[T](f: T => Boolean)(buffer: DataList[T])(l: DataList[T]): DataList[T] = l match { + case NonEmptyList(head, tail) => filterImpl(f)(if (f(head)) NonEmptyList(head,buffer) else buffer)(tail) + case EmptyList => reverse(buffer, EmptyList) + } + final def filter[T](f: T => Boolean): DataList[T] => DataList[T] = filterImpl(f)(DataList.EmptyList) @@ -43,6 +59,5 @@ object ListOps { * Используя композицию функций реализуйте collect. Collect - комбинация filter и map. * В качестве фильтрующего правила нужно использовать f.isDefinedAt */ - def collect[A, B](f: PartialFunction[A, B]): DataList[A] => DataList[B] = ??? - + def collect[A, B](f: PartialFunction[A, B]): DataList[A] => DataList[B] = filter(f.isDefinedAt).andThen(map(f)) } \ No newline at end of file