Впервые о библиотеке кошек я услышал в видео от автора @ d6 в конце 2014 года, довольно интересно, я сразу перескочил на сайт, чтобы узнать больше, первое, что меня напугало - это логотип (4 коты с 5 стрелками направления), сказал я себе - эта библиотека не для смертных :(
У меня не было другого выбора, кроме как подождать какое-то время, возможно, в будущем все прояснится, я последовал совету @kaffeecoder в его серии блог the-neophytes-guide-to-scala
“More often than not, a good way to really get comfortable with a new language and its whole ecosystem of libraries is to use it for creating something useful”
A начал с создания приложения для агрегирования GPS с playframework, и неожиданно неожиданно мне потребовалось сделать некоторые очень простые вещи, такие как
- Обобщите список параметров Scala без множественных сопоставлений.
- Манипулирование ценностью в будущем опционов.
- Объединяя будущее будущего.
- и многое другое ……….
Это, очевидно, было не очень удобно делать в стандартной Scala, но, к счастью, учебник по пасти кошек от @ eed3si9n дал мне все необходимое для изучения кошек - эта библиотека кошек была ТОЛЬКО библиотекой, которая следовала теории категорий принципы, и мне не нужно было изучать теорию категорий, прежде чем я смогу ее использовать.
Это очень помогло мне решить 3 проблемы, о которых я упоминал выше, и больше погрузиться в программирование на уровне типов.
Apply, Semigroup, Applicative, Functor, Monoid, Monad - эти модные слова пугают объектно-ориентированных программистов, не имеющих опыта функционального программирования (таких как я). Но поверьте мне, это просто классы типов, которые подчиняются некоторым определенным законам.
Начнем с функторов
Функторы - - это «класс типа», у которого есть одна ключевая функция, называемая «map», которая предназначена для управления такими типами данных, как List [Int], Option [String] и Futures. [Int] (типы данных этого естественного слова обычно обозначаются как F [A])
def map[A, B](fa: F[A])(f: A => B): F[B]
объяснение функции отображения функтора.
(fa : F[A]) — a data-type that take only one data-type e.g List, Future , Options (f: A => B ) — a function that transform a type A to a type B e.g function that takes a string and return an Int. F[B] — the final return type of the Functor's map function e.g if our "fa" variable is a List[String] and our "f" function is String => Int , then our map function return type will be a List[Int]
Демо
Чтобы начать работу с SBT, просто добавьте в файл build.sbt следующее:
libraryDependencies += "org.typelevel" %% "cats" % "0.7.2"
импортировать кошек в ваш REPL
scala> import cats._, cats.instances.all._ import cats._ import cats.instances.all._ scala> val len: String => Int = _.length len: String => Int = <function1> scala> Functor[List].map(List("scala", "cats")) (len) res0: List[Int] = List(5,4)
Использование Either в качестве функтора
Стандартный тип Either в Scala не имеет функции «map», однако библиотека cats определяет для него экземпляр Functor.
scala> import cats.syntax.functor._ import cats.syntax.functor._ scala> val r: Either[String, Int] = Right(100) r: Either[String,Int] = Right(100) scala> r.map( x => x + 1 ) res1: Either[String,Int] = Right(101)
Одна красивая функция внутри класса типов Cat Functor, которая мне очень понравилась, - это «fproduct», которая связывает значение с результатом применения функции к этому значению.
scala> val len: String => Int = _.length len: String => Int = <function1> scala> List(“scala”, “cats”).fproduct(len) res3: List[(String, Int)] = List((scala,5), (cats,4))
чтобы сделать более читаемым и полезным результат можно преобразовать в коллекцию Map;) используя toMap
scala> res3.toMap res4: scala.collection.immutable.Map[String,Int] = Map(scala -> 5, cats -> 4)
В классе типа функтор кошек есть и другие интересные функции, которые вы можете попробовать, например, lift, compose, as.
Если вам нравится эта рецензия, нажмите ниже, чтобы больше людей могли увидеть ее здесь, на Medium.