Впервые о библиотеке кошек я услышал в видео от автора @ 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, и неожиданно неожиданно мне потребовалось сделать некоторые очень простые вещи, такие как

  1. Обобщите список параметров Scala без множественных сопоставлений.
  2. Манипулирование ценностью в будущем опционов.
  3. Объединяя будущее будущего.
  4. и многое другое ……….

Это, очевидно, было не очень удобно делать в стандартной 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.

Теперь вы можете продолжить с part2 , part3 и part4